我最近迁移了一个网站,并遇到了与字符编码有关的问题。该数据库配置为Latin1,而Apache默认为UTF-8。此不匹配导致与网站中帖子的标记系统有关的串行函数断开(Unsialialize():27个字节的偏移22个字节的错误),因为它们依靠直接数据库连接来检索标签关联。
在先前的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兼容性?
任何洞察力都将不胜感激!
如XXX(Q&A)概述的序列化数据,必须将序列化数据存储在文本字段中,该字段用字符编码您必须重做迁移。在重做迁移之前,您必须先迁移序列化数据并修复受影响字段的列类型。
(或:如果您的设置当前与解决方法一起使用,则可以在不重做迁移的情况下执行此操作。应用修复程序后(请参阅下文),它可以在没有解决方法的情况下使用
固定,并且可以删除解决方法。 )
bant tand binary。
要删除双重否定:PHP序列化数据将存储在二进制列中。如果您做一些问题,例如您描述的问题可能会出现。 识别受影响的列 检验
unserialize()针对迁移的列,其连接编码会引起您看到的错误。 通过将其编码转换为二进制,将列彻底。 检验unserialize()
反对迁移的列,现在应该免疫连接编码。