【问题标题】:UTF-8 problem on WAMP with simultaneous MySQL and ODBC-AS400WAMP 上的 UTF-8 问题,同时使用 MySQL 和 ODBC-AS400
【发布时间】:2020-12-08 09:05:34
【问题描述】:

目前我有这个配置: 服务器 Windows 2008 R2 企业版、Apache 2.4.23、PHP 5.6.25、MySQL 5.7.14

我正在将我的应用程序移植到新的应用程序中: 服务器 Windows 2019 数据中心、Apache 2.4.41、PHP 7.4.0、MySQL 8.0.18。

我“复制”了一些我知道的关于 Apache、PHP、MySQL、标头的配置,尤其是那些引用字符编码的配置,例如 php.ini 上的 default-charset=iso-8859-1、httpd 上的 AddDefaultCharset UTF-8 .conf,在 MySQL 上使用 utf8mb4_general_ci 排序规则,在标头上使用 content="text/html; charset=UTF-8"。

我使用相同的参数配置了一个 ODBC DSN,其中 iSeries 驱动程序指向一个 AS400 db。

为了与 db 连接,我使用不带参数的字符集的 PDO。

在实际系统上,我对 à、°、€ 等特殊字符没有问题:我从两个数据库中读取,显示在 html 页面上。一些应用程序只使用 MySQL,其他只使用 ODBC,其他两者都使用:我从 AS400 获取字符串并保存在 MySQL 上。

在新系统上,我无法拥有相同的功能,因为使用 default_charset=iso-8859-1 只有 ODBC 应用程序运行良好,但 MySQL 显示错误,如 ° 为 ° 或 ò 为 ò,如果我set default_charset=UTF-8 MySQL 应用程序运行良好,并且 ODBC ° 变为 �,因此我无法从 AS400 获取字符串并将它们保存在 MySQL 上。

我的应用程序非常简单(不涉及框架),所以两个系统上的 PHP 代码是相同的(我稍后会改进)。

我想我丢失了一些配置:一些建议?

谢谢

PS:如果有其他有用的信息可以帮助我找到解决方案,请告诉我。

编辑

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

编辑 2:应用程序

根据要求,如果有用,我会提供一些关于我的应用的附加信息。

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

编辑 3:关于 mysql 驱动程序/连接/配置

使用带有 echo '°' 和 print_r($mysql_data) 的相同代码进行测试后,结果如下:

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

我确信“问题”出在 MySQL 连接上,可能是我设置的但不记得了 :-(

【问题讨论】:

  • php 应该是 UTF-8 - 这是自 v5.6 以来的默认值,
  • iso-8859-1 不是 unicode - 它是一个 1byte 字符集。如果您需要 unicode 功能,则不应出现在数据路径中的任何位置
  • @Nikkorian 我“知道”使用 iso-8859-1 是错误的,但是在旧系统上使用此设置一切正常。可能是“错误”配置的组合导致了一个 worging 集,但我不知道如何。
  • 如果您的数据以 ISO-8859 开头,那没有错(à°€ò 都可以是 ISO-8859)。您能否更具体地了解应用程序的架构?你有一个 php 中的 Web 应用程序,通过 PDO 来自 mysql 的数据。还有什么事情? AS400 - Mysql 数据传输什么应用程序,什么语言?我的阅读 atm:旧系统使用所有 ISO-8859,但现在您将 ISO-8859 字符串传递到需要 UTF-8 的环境中。尝试将所有内容(ODBC、MYSQL、PHP)放入 ISO-8859,然后在将数据放入网页时使用 mb_convert_encoding($data,'UTF-8')。浏览器需要 UTF8。
  • 我刚看到你的第一个编辑。坦率地说,这看起来是一个很好的解决方案。从 AS400 通过 ODBC 到 MYSQL 的 ISO-8859 - 在存储之前转换为 UTF-8 - 然后 UTF-8 一直到网页。完美的。假设您的 AS400 数据采用 ISO-8859 格式,则必须在某处转换为 UTF-8,而如今在 UTF-8 格式中使用 MYSQL 和 PHP 是标准做法。 (其实 UTF8mb4 中的 MYSQL 是首选,因为 MYSQL 的 UTF-8 不是真正的 unicode char set )。

标签: php mysql apache utf-8 odbc


【解决方案1】:

我在这里报告解决方案,以防其他人遇到同样的问题。 感谢一位朋友将我与 MySQL 8 与 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.8 替换为 v.5.7 和所有进展顺利。

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

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 2011-06-05
    • 2010-12-15
    • 2017-03-07
    • 1970-01-01
    • 2023-03-23
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多