我最近迁移了一个网站,并遇到了与字符编码有关的问题。该数据库配置了Latin-1,而Apache默认为UTF-8。
此不匹配导致与网站中帖子的标记系统有关的串行函数破坏(Unsialialize():偏移27个字节的错误22个字节),因为它们依靠直接数据库连接来检索TAG Associations。哪个环境变量可能是负责的?我自己问这个问题,因为在以前的EC2环境中,某些东西(可能是一个环境变量)似乎似乎是为了管理这种通信,从而确保了PHP与数据库之间的适当互动。但是,迁移后,这种机制丢失了,我无法确定其配置的位置。 我尝试了以下方法而没有成功:
Checking and changing php.ini, httpd.conf and charset.conf settings to latin1 (default was set to UTF-8).
Converting the database to UTF-8.
Adding a condition in a function in config.php to force the connection to use latin1 (this temporarily resolved the issue but doesn’t explain the root cause).
这里是上一个EC2实例的服务器详细信息,新实例基于Apache7.3 Docker:
MySQL: Ver 15.1 Distrib 5.5.68-MariaDB, for Linux (x86_64) using readline 5.1
Apache: 2.4.6 (CentOS)
PHP: 7.3.33 with Zend OPcache v7.3.33
任何人都知道哪种环境变量或配置文件可能负责确保上一个设置中的Charset兼容性?
任何洞察力都将不胜感激!
任何人都知道哪个[参数]可能负责确保上一个设置中的charset兼容性?
(或:如果您的设置当前与解决方法一起使用,则可以在不重做迁移的情况下执行此操作。应用修复程序后(请参阅下文),它可以在没有解决方法的情况下使用short答案:许多参数可能会影响这一点。
,但您也许想了解它的根源(以及如何修复它。)立即,您可能必须重做迁移。在重做迁移(精神上)之前,您必须先迁移序列化数据并修复受影响列的列类型。
固定,并且可以删除解决方法。 )
在MySQL数据库(Q&a)
中列出序列化对象时,必须将序列化数据存储在文本字段中,除非您设法在连接上保留它的二进制值,否.要删除双重否定:PHP序列化数据
将存储在二进制列中。如果您做一些问题,例如您描述的问题可能会出现。 识别受影响的列。 检验unserialize()
针对已确定的列的连接进行编码,该连接引起了您看到的错误。通过将其编码转换为二进制,将列彻底。 检验unserialize()反对迁移的列,现在应该免疫连接编码。 UTF-8现在错了吗?不,您非常适合将UTF-8用于浏览器,这极大地增强了书面文本,JSON文本和HTML/XML数据的可移植性和互操作性。 您想考虑您解决了序列化柱的问题,以便考虑到其他文本列列的序列化 - 柱从拉丁-1到UTF-8,
这将帮助您完全迁移数据库,并了解数据库charset/Connection编码以及所有这些配置详细信息。但是我建议先使用二进制列练习(PHP序列化数据)。参考: