网站首页 > 技术文章 正文
现象
通过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 表示不进行任何转换。 |
核心流程总结(“三剑客”):
一个完整的请求和响应过程依赖于这三个变量的一致性:
- 客户端声明:我是用 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
猜你喜欢
- 2025-09-13 每次写SQL时总忘记语法顺序怎么办,这里一招教你解决
- 2025-09-13 Spring Boot 2.x中集成H2 内存数据库使用入门
- 2025-09-13 MySQL常用数据类型_mysql数据类型和用途
- 2025-09-13 Mybatis中SQL全大写或全小写影响执行性能吗
- 2025-09-13 MySQL 8.0——创建并使用数据库、获得数据库和表的信息
- 2025-09-13 mysql8.0配置文件优化_mysql配置文件参数优化
- 2025-09-13 清华学长熬夜20天整理出的“数据库MySQL”基础篇「小白必看!」
- 2025-09-13 Windows 中安装 MariaDB 数据库_如何安装mariadb
- 2025-09-13 邮箱区分大小写吗?一文探讨RFC规范
- 2025-07-08 软件测试报错_tomcat运行代码错误日志及问题解决
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- mysqlany_value (79)
- static函数和普通函数 (84)
- el-date-picker开始日期早于结束日期 (76)
- js判断是否是json字符串 (75)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)