【发布时间】: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