目录

MYSQL字符集编码差异导致的异常

MYSQL【字符集编码差异导致的异常】

1. 插入数据时报错

问题 1:Incorrect string value(字符串值错误)

错误示例:

INSERT INTO my_table (name) VALUES ('😀');

可能的错误消息:

ERROR 1366 (HY000): Incorrect string value: '\xF0\x9F\x98\x80' for column 'name' at row 1

原因:

表的字符集是 utf8,但 utf8 最多支持 3 字节,而 emoji 需要 4 字节。

解决方案:

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

utf8mb4 是 utf8 的超集,支持 4 字节字符(如 emoji)。

utf8mb4_general_ci 是不区分大小写的排序规则。

2. 查询乱码

问题 2:查询时返回乱码

示例:

SELECT name FROM my_table;

可能的结果:

好世界

原因:

客户端和 MySQL 服务器的字符集不匹配。

排查步骤:

SHOW VARIABLES LIKE 'character_set_%';

如果 character_set_client, character_set_connection, character_set_results 不是 utf8mb4,可能导致乱码。

解决方案:

SET NAMES utf8mb4;

或者在 Java 连接 MySQL 时,确保 JDBC URL 设置正确:

String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8mb4";

3. 数据截断

问题 3:字符串被截断

错误示例:

CREATE TABLE my_table (
    name VARCHAR(10) CHARACTER SET utf8mb4
);

INSERT INTO my_table (name) VALUES ('𝄞𝄞𝄞𝄞𝄞');  -- 5  4 字节字符

错误消息:

Data truncated for column 'name' at row 1

原因:

VARCHAR(10) 指定长度 以字符计,但 utf8mb4 可能占 4 字节/字符,超出存储限制。

解决方案:

增加存储长度:

ALTER TABLE my_table MODIFY name VARCHAR(40) CHARACTER SET utf8mb4;

使用 TEXT 类型存储长字符串:

ALTER TABLE my_table MODIFY name TEXT CHARACTER SET utf8mb4;

4. 比较字符串异常

问题 4:排序规则导致比较失败

示例:

SELECT 'a' = 'A';

可能的结果(不同排序规则影响比较行为):

排序规则 结果

utf8mb4_general_ci TRUE

utf8mb4_bin FALSE

原因:

utf8mb4_general_ci 是 不区分大小写 的。

utf8mb4_bin 是 区分大小写 的。

解决方案:

如果需要严格区分大小写:

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

5. Java 连接 MySQL 时字符集不匹配

问题 5:JDBC 连接 MySQL 时插入数据乱码

错误示例(Java 代码):

String url = "jdbc:mysql://localhost:3306/mydb";
Connection conn = DriverManager.getConnection(url, "root", "password");

PreparedStatement pstmt = conn.prepareStatement("INSERT INTO my_table (name) VALUES (?)");
pstmt.setString(1, "你好");
pstmt.executeUpdate();

可能的错误:

插入后,查询数据库发现 你好 变成 ??? 或乱码。

原因:

JDBC 默认编码 可能不是 utf8mb4,导致数据存储时丢失信息。

解决方案:

在 JDBC URL 中添加 useUnicode=true&characterEncoding=utf8mb4:

String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8mb4";

总结

https://i-blog.csdnimg.cn/direct/092702d3aeed469c8ea968bbeb2a5227.png