更换Hostinger主机后emoji正常但LIKE查询无结果求助
解决Hostinger服务器Emoji显示与LIKE搜索冲突问题
我刚梳理完你的问题,这其实是utf8mb4字符集与排序规则不匹配导致的典型场景,咱们一步步来搞定:
问题根源拆解
- 为什么换Hostinger后Emoji乱码?
你的本地和GoDaddy服务器默认可能已经隐式支持utf8mb4(真正能容纳4字节Emoji的UTF-8子集),但Hostinger的默认配置还是旧的utf8(仅支持3字节Unicode字符),直接迁移后Emoji自然变成乱码。 - 为什么改
utf8mb4_bin后搜索失效?utf8mb4_bin是二进制排序规则,它会严格按照字符的二进制值做匹配——不仅区分大小写,连字符的Unicode编码细节都会死磕,这就导致你的LIKE '%some name%'无法匹配存储内容(比如大小写差异、编码对齐问题),phpMyAdmin里搜索失效也是同样道理。
分步解决方案
1. 统一数据库/表/列的字符集与排序规则
把所有相关对象的字符集改成utf8mb4,排序规则用**utf8mb4_unicode_ci**(或utf8mb4_general_ci,前者更符合Unicode标准),别再用bin:
-- 修改数据库默认字符集 ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 修改目标表的字符集(会自动同步列的设置) ALTER TABLE allfiles CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 如果列没自动同步,单独修改列(可选) ALTER TABLE allfiles MODIFY COLUMN file_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2. 修复PHP数据库连接的字符集配置
你之前手动执行SET语句的方式不够可靠,直接用MySQLi的专用函数设置连接字符集,它会同时搞定客户端、连接、结果集的编码对齐:
// 数据库连接成功后,立即执行这行代码 mysqli_set_charset($con, 'utf8mb4'); // 替代你之前的4条SET语句,这一行就够了
3. 确保页面输出编码正确
在PHP页面开头加上编码声明,避免前端显示时出现编码混乱:
header('Content-Type: text/html; charset=utf-8');
同时在HTML的<head>里补上:
<meta charset="UTF-8">
验证效果
做完以上三步后:
- Emoji应该能正常显示(
utf8mb4完美支持4字节字符) SELECT * FROM allfiles WHERE file_name LIKE '%some name%'会正常返回匹配结果(utf8mb4_unicode_ci是不区分大小写的排序规则,和你之前在GoDaddy/本地的逻辑一致)- phpMyAdmin里的搜索功能也会恢复正常
补充说明
为什么本地和GoDaddy没这个问题?大概率是这两个环境的数据库默认配置已经启用了utf8mb4,或者表的默认排序规则就是utf8mb4_unicode_ci,不需要手动调整。Hostinger的默认配置更保守,所以需要咱们手动统一编码规则。
内容的提问来源于stack exchange,提问作者Skyyy
相关产品推荐
相关产品推荐

