MySQL中UTF8与utf8_general_ci排序规则下字符串匹配失败问题
问题原因及解决方案
原因分析
查询无结果的核心问题是字符集不匹配导致插入时字符被错误转换:
- 你的
login字段指定了utf8(MySQL中实际对应utf8mb3)字符集,但如果客户端连接数据库时使用的字符集(比如latin1)与字段字符集不一致,插入'uè'时会发生错误编码转换。 - 举个例子:
è在latin1中是单字节0xE8,而在utf8mb3中是双字节0xC3A8。如果客户端用latin1发送数据,服务器会把0xE8当作utf8mb3字符处理,最终存储的是乱码而非正确的'uè',自然查询不到匹配结果。
注:utf8_general_ci排序规则本身不会导致'uè'无法匹配,问题根源还是编码转换错误。
解决方法
1. 检查并修正连接字符集
先执行以下命令查看当前连接的字符集配置:
SHOW VARIABLES LIKE 'character_set%';
确保character_set_client、character_set_connection、character_set_results这三个变量的值与表字段的字符集一致(此处应为utf8或utf8mb3)。
如果不一致,在连接数据库后执行语句修正:
SET NAMES utf8;
也可以在数据库连接字符串中直接指定字符集(比如JDBC连接添加?useUnicode=true&characterEncoding=utf8)。
2. 重新插入正确数据
先删除之前插入的错误记录:
DELETE FROM login_user WHERE id_user = 1;
在确保连接字符集正确的前提下,重新执行插入语句:
INSERT INTO login_user (id_user, login) VALUES (1, 'uè');
此时再执行查询语句即可得到预期结果。
3. 推荐优化:改用utf8mb4字符集
MySQL的utf8(utf8mb3)仅支持BMP范围内的字符,无法存储emoji等特殊字符。建议将表和字段的字符集改为utf8mb4,同时使用更精确的utf8mb4_unicode_ci排序规则:
ALTER TABLE login_user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
之后按正确字符集插入数据,能避免更多字符编码类问题。
内容的提问来源于stack exchange,提问作者Mario Rovelli
相关产品推荐
相关产品推荐

