WAMP上同时存在MySQL和ODBC-AS400的UTF-8问题

问题描述

当前,我有以下配置: 服务器Windows 2008 R2 Enterprise,Apache 2.4.23,PHP 5.6.25,MysqL 5.7.14

并且我正在使用以下命令将我的应用程序移植到新的应用程序: 服务器Windows 2019 Datacenter,Apache 2.4.41,PHP 7.4.0,MysqL 8.0.18。

我“复制”了一些我知道的有关Apache,PHPMysqL,标头的配置,特别是那些引用字符编码的配置,例如PHP.ini上的default-charset = iso-8859-1,httpd上的AddDefaultCharset UTF-8 .conf,在MysqL上为utf8mb4_general_ci排序规则,在标题上为content =“ text / html; charset = UTF-8”。

在两者上,我都使用相同的参数配置了ODBC DSN,该DSN带有指向AS400数据库的iSeries驱动程序。

要与数据库连接,我使用不带字符集参数的PDO。

在实际系统上,我对à,°,€之类的特殊字符没有问题:我从两个数据库读取内容,并显示在html页面上。一些应用程序仅使用MysqL,其他应用程序仅使用ODBC,另一些应用程序则同时使用:我从AS400中获取字符串并保存在MysqL中。

在新系统上,我无法具有相同的功能,因为对于default_charset = iso-8859-1,只有ODBC应用程序可以正常工作,但是MysqL显示错误(如°表示°或ò表示ò),如果我set default_charset = UTF-8 MysqL应用程序运行良好,并且与ODBC°成为�,因此我无法从AS400中获取字符串并将其保存在MysqL中。

我的应用程序非常简单(不涉及框架),因此两个系统上的PHP代码都相同(稍后将对其进行改进)。

我认为我正在丢失一些配置:一些建议?

谢谢

PS:请告知我是否还有其他有用的信息,以获取解决方案。

编辑

作为准时的解决方案,我可以将utf8_encode与ODBC中的字符串一起使用,具有default-charset = utf-8,但是在更改所有代码之前,我将尝试查找全局解决方案。

编辑2:应用程序

如果需要,我会在我的应用中提供一些其他信息。

  • AS400 db由ERP管理,因此我仅在读取模式下使用它。 某些应用通过PDO发送查询显示结果(例如“销售”)。
  • MysqL db用于存储非ERP管理的数据(例如Quality)。 应用程序使用用户插入的数据通过PDO进行CRUD操作。
  • 混合的应用程序从AS400(例如产品)中检索一些数据,从用户那里检索一些数据并保存在MysqL中。
  • MysqL上创建“镜像”表,以包含AS400表的视图(以获得更好的响应)。一个应用程序会定期从AS400中获取数据并将其存储在MysqL中。

编辑3:在MysqL驱动程序/连接/配置上

使用相同的代码执行测试后,该代码具有回声“°”和带有以下结果的print_r($ MysqL_data):

  • 实际:echo =>°print_r =>°
  • 新:echo =>°print_r =>°

我坚信“问题”在MysqL连接上,也许是我设置的但不记得的内容:-(

解决方法

我在这里报告了解决方案,以防其他人遇到相同的问题。 多亏了一个将我联系到处理字符集的MySQL 8 vs 5.7差异(https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html#charset-connection-error-handling)上的朋友(“ utf8mb4的默认排序规则在MySQL 5.7和8.0之间不同”),我用v.5.7替换了v.8。一切顺利。

好吧,这通常不是“解决方案”,而只是确认问题出在MySQL 8 / PHP互连的“配置”中。