现象
通过ubunut控制台的mysql命令行执行如下语句创建数据库表。
CREATE TABLE `t_user_session` (
`f_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键:唯一标识特定表的一个记录',
`f_user_id` int(11) NOT NULL COMMENT '用户ID',
`f_para_name` varchar(128) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '参数名',
`f_para_value` varchar(512) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '参数值',
`f_create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`f_modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`f_id`) USING BTREE,
UNIQUE KEY `unq_user_id_and_para_name` (`f_user_id`,`f_para_name`) USING BTREE,
KEY `idx_uid` (`f_user_id`) USING BTREE,
KEY `idx_para_name` (`f_para_name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
在#dbeaver#下看到注释为乱码,如下图。

DBeaver看到的乱码
原理
MySQL的工作原理需要有所了解,数据在客户端、服务端、传输过程中,MYSQL提供了转换的机制,并通过变量予以设定。如果存在不一致就可能出现乱码。客户端与服务端要针对性适配编码规则。相关的几个变量介绍如下:
字符集变量 (character_set_%) 详解
这些变量控制了MySQL不同层面的字符编码方式。
|
变量名 |
值 |
含义与作用 |
|
character_set_client |
utf8mb4 |
(最重大变量之一) 表明客户端发送SQL语句时使用的字符集。MySQL服务器会假设客户端发送的字节流是这个字符集。 |
|
character_set_connection |
utf8mb4 |
(最重大变量之一) 服务器收到SQL语句后,会将其从 character_set_client 转换到这个字符集。它用于字符串字面量的转换(如 '中文')。 |
|
character_set_results |
utf8mb4 |
(最重大变量之一) 服务器向客户端返回数据(查询结果、错误信息等)时使用的字符集。服务器会将数据从内部格式转换到这个字符集再发送出去。 |
|
character_set_database |
utf8mb4 |
当前默认数据库的字符集。当您在这个数据库中创建新表且没有指定字符集时,就会使用这个值。 |
|
character_set_server |
utf8mb4 |
MySQL服务器默认的字符集。如果创建数据库时没有指定字符集,就会使用这个值。 |
|
character_set_system |
utf8 |
MySQL系统元数据(如表名、列名等)存储时使用的字符集,一般是 utf8(注意这里是 utf8 不是 utf8mb4),用户一般无法也不需修改。 |
|
character_set_filesystem |
binary |
用于解释文件路径字符串(如 LOAD DATA INFILE 中的路径),设置为 binary 表明不进行任何转换。 |
核心流程总结(“三剑客”):
一个完整的请求和响应过程依赖于这三个变量的一致性:
- 客户端声明:我是用 utf8mb4 编码发送的语句。 (character_set_client)
- 服务器处理:好的,我会把你发来的语句当作 utf8mb4,并在内部处理时也转换成 utf8mb4。 (character_set_connection)
- 服务器返回:我将把结果数据用 utf8mb4 编码发回给你。 (character_set_results)
另外字符集还会影响排序与条件。主要有如下几个变量。
校对规则变量 (collation_%) 详解
校对规则(Collation)是字符集内用于比较和排序的规则(例如:是否区分大小写、是否区分重音)。
|
变量名 |
值 |
含义与作用 |
|
collation_connection |
utf8mb4_general_ci |
当前连接中用于字符串比较的默认规则。general_ci 表明通用规则,不区分大小写(case insensitive)。 |
|
collation_database |
utf8mb4_bin |
当前默认数据库的默认校对规则。_bin 表明二进制比较,它会区分大小写。 |
|
collation_server |
utf8mb4_general_ci |
MySQL服务器默认的校对规则。 |
故障识别
第一查看数据库本身的字符集设置、
mysql> SHOW VARIABLES LIKE 'character_set_%';
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id: 286859
Current database: db_jygt
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (16 min 24.80 sec)
mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database | utf8mb4_bin |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.04 sec)
这里字符集是一致的,校对有不一致的情形,可能在order或者group的时候结果不如预期。因此需要检查#dbeaver




















暂无评论内容