MySQL运维实战(5.4) MySQL元数据乱码

俊达2年前技术文章1191

表结构Comment乱码

如果DDL实际编码和character_set_client设置不一致,也会引起乱码。


$ cat test_comment_utf8.sql
create table test_comment_utf8(a int comment '列列列列列AAA') 
  comment 'BBBB表表表表表BBBB';

$ od -t x1 test_comment_utf8.sql
0000000    63  72  65  61  74  65  20  74  61  62  6c  65  20  74  65  73
0000020    74  5f  63  6f  6d  6d  65  6e  74  5f  75  74  66  38  28  61
0000040    20  69  6e  74  20  63  6f  6d  6d  65  6e  74  20  27  e5  88
0000060    97  e5  88  97  e5  88  97  e5  88  97  e5  88  97  41  41  41
0000100    27  29  20  63  6f  6d  6d  65  6e  74  20  27  42  42  42  42
0000120    e8  a1  a8  e8  a1  a8  e8  a1  a8  e8  a1  a8  e8  a1  a8  42
0000140    42  42  42  27  3b  0a
0000146


上述SQL文件以UTF8编码( “列”的utf8编码为e5  88  97,“表”的utf8编码为e8  a1  a8)

将character_set_client设置为gbk,执行上述SQL:

mysql> set character_set_client=gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table test_comment_utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> source test_comment_utf8.sql;
Query OK, 0 rows affected (0.00 sec)


表和字段的注释出现了乱码,元数据存储的数据也不对:

mysql> show create table test_comment_utf8\G
*************************** 1. row ***************************
       Table: test_comment_utf8
Create Table: CREATE TABLE `test_comment_utf8` (
  `a` int DEFAULT NULL COMMENT '鍒楀垪鍒楀垪鍒桝AA'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 
COMMENT='BBBB琛ㄨ〃琛ㄨ〃琛˙BBB'
1 row in set (0.00 sec)

mysql> select table_name, table_comment, hex(table_comment) from information_schema.tables where table_name = 'test_comment_utf8';
+-------------------+-------------------------+--------------------------------------------------------------+
| TABLE_NAME        | TABLE_COMMENT           | hex(table_comment)                                           |
+-------------------+-------------------------+--------------------------------------------------------------+
| test_comment_utf8 | BBBB琛ㄨ〃琛ㄨ〃琛˙BBB | 42424242E7909BE384A8E38083E7909BE384A8E38083E7909BCB99424242 |
+-------------------+-------------------------+--------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select column_name, column_comment, hex(column_comment) from information_schema.columns where table_name = 'test_comment_utf8';
+-------------+--------------------+------------------------------------------------------+
| COLUMN_NAME | COLUMN_COMMENT     | hex(column_comment)                                  |
+-------------+--------------------+------------------------------------------------------+
| a           | 鍒楀垪鍒楀垪鍒桝AA | E98D92E6A580E59EAAE98D92E6A580E59EAAE98D92E6A19D4141 |
+-------------+--------------------+------------------------------------------------------+
1 row in set (0.01 sec)



utf8终端查看表结构

mysql> set names 'utf8';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show create table test_comment_utf8\G
*************************** 1. row ***************************
       Table: test_comment_utf8
Create Table: CREATE TABLE `test_comment_utf8` (
  `a` int DEFAULT NULL COMMENT '鍒楀垪鍒楀垪鍒桝AA'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 
COMMENT='BBBB琛ㄨ〃琛ㄨ〃琛˙BBB'
1 row in set (0.00 sec)

mysql> set names 'gbk';
Query OK, 0 rows affected (0.00 sec)

mysql> show create table test_comment_utf8\G
*************************** 1. row ***************************
       Table: test_comment_utf8
Create Table: CREATE TABLE `test_comment_utf8` (
  `a` int DEFAULT NULL COMMENT '列列列列列AAA'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 
COMMENT='BBBB表表表表表BBBB'
1 row in set (0.00 sec)


gbk终端查看数据

mysql> set names 'utf8';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show create table test_comment_utf8\G
*************************** 1. row ***************************
       Table: test_comment_utf8
Create Table: CREATE TABLE `test_comment_utf8` (
  `a` int DEFAULT NULL COMMENT '閸掓鍨崚妤鍨崚妗滱A'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 
COMMENT='BBBB鐞涖劏銆冪悰銊ㄣ冪悰藱BBB'
1 row in set (0.00 sec)

mysql> set names 'gbk';
Query OK, 0 rows affected (0.00 sec)

mysql> show create table test_comment_utf8\G
*************************** 1. row ***************************
       Table: test_comment_utf8
Create Table: CREATE TABLE `test_comment_utf8` (
  `a` int DEFAULT NULL COMMENT '鍒楀垪鍒楀垪鍒桝AA'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 
COMMENT='BBBB琛ㄨ〃琛ㄨ〃琛˙BBB'
1 row in set (0.00 sec)



总结

建表时字符集相关参数设置不对,可能会导致表的元数据(如表名、列名、表和列的注释、存储过程中的字符)产生乱码。




相关文章

MySQL运维实战(2.1) 登录失败次数太多导致主机被block的问题处理

参数max_connect_errorsMySQL有参数max_connect_errors,当一个主机尝试登录MySQL,失败的次数超过了max_connect_errors,则这个主机将无法登录到...

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

MySQL优化器特性(三)表关联之BKA(Batched Key Access)优化

单表range查询时,可以使用MRR优化,先对rowid进行排序,然后再回表查询数据。在表关联的时候,也可以使用类似的优化方法,先根据关联条件取出被关联表的rowid,将rowid缓存在join bu...

MySQL运维实战之ProxySQL(9.2)ProxySQL安装和配置

proxysql安装proxysql提供了各个linux发行版的安装包,我们可以使用操作系统的包管理系统来安装proxysql。这里我们以CentOS 7为例:1、从github下载安装包根据OS版本...

MySQL运维实战(3.3) 管理数据库(database)

数据库使用create database语句创建数据库。创建数据库的账号需要有create权限。创建数据库用户拥有create权限才能创建数据库。-- 例子:创建dba用户,拥有创建数据库名...

MySQL运维实战(5.6) 字符集设置对mysqldump的影响

mysqldump不指定字符集不指定字符集时,默认使用了utf8。可能和环境有关系。mysqldump -uroot test test_load >&n...

MySQL运维实战(7)建立复制

建立复制的基本步骤1、主库开启binlog主库需要配置的关键参数server_id:主备库需要设置为不同。log_bin:binlog文件的前缀,可以指定绝对路径,也可以只指定文件名。若不指定路径,b...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。