优秀的编程知识分享平台

网站首页 > 技术文章 正文

MySQL日常问题之一:DBeaver看到控制台创建的中文注释为乱码

nanyue 2025-09-13 07:12:25 技术文章 2 ℃

现象

通过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#下看到注释为乱码,如下图。

原理

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 表示不进行任何转换。

核心流程总结(“三剑客”):
一个完整的请求和响应过程依赖于这三个变量的一致性:

  1. 客户端声明:我是用 utf8mb4 编码发送的语句。 (character_set_client)
  2. 服务器处理:好的,我会把你发来的语句当作 utf8mb4,并在内部处理时也转换成 utf8mb4。 (character_set_connection)
  3. 服务器返回:我将把结果数据用 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


最近发表
标签列表