网站更换托管服务器后数据库内乌尔都语文字无法正常显示求助
问题排查解决步骤
1. 修正PDO连接配置(最高概率触发问题)
你当前的PDO连接代码未显式指定连接字符集,即使库表排序规则配置正确,若MySQL连接默认字符集不是utf8mb4,也会导致读取内容转码错误。
将PDO连接代码修改为如下内容:
$this->_pdo = new PDO( 'mysql:host=' . Config::get('mysql/host') . ';dbname=' . Config::get('mysql/db') . ';charset=utf8mb4', Config::get('mysql/username'), Config::get('mysql/password'), [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci" ] );
注:新增的charset=utf8mb4参数会强制指定PDO连接使用utf8mb4字符集,可选的INIT_COMMAND参数可进一步确保连接排序规则和库表配置对齐
2. 校验数据库层级字符集配置
执行如下SQL查询当前库、表、对应存储乌尔都语字段的字符集配置,确认所有层级都为utf8mb4,排序规则为utf8mb4_unicode_ci:
-- 查数据库字符集 SELECT default_character_set_name, default_collation_name FROM information_schema.SCHEMATA WHERE schema_name = '替换为你的数据库名'; -- 查表字符集 SELECT table_name, table_collation FROM information_schema.TABLES WHERE table_schema = '替换为你的数据库名'; -- 查字段字符集 SELECT column_name, character_set_name, collation_name FROM information_schema.COLUMNS WHERE table_schema = '替换为你的数据库名' AND table_name = '替换为存储乌尔都语的表名';
如果存在字符集不是utf8mb4的字段,执行ALTER语句修改即可。
3. 校验HTTP响应头编码配置
部分服务器默认会在HTTP响应头中指定Content-Type的编码值,优先级高于HTML头部的meta标签。可以通过浏览器F12开发者工具的「网络」面板,打开页面请求的「响应头」标签,确认Content-Type字段值为text/html; charset=UTF-8,如果不一致需要修改站点服务器(Apache/Nginx)的配置。
4. 校验迁移数据本身完整性
如果上述配置都正确,需要确认迁移时的数据库导出/导入操作没有出现转码错误:导出时需指定字符集为utf8mb4,不要使用老旧的UTF-8(即utf8mb3)编码导出,导入时也需选择对应字符集,避免数据在迁移过程中被转码损坏。
内容的提问来源于stack exchange,提问作者Mohsin Ahmed
相关产品推荐
相关产品推荐

