解决docker mysql不能写入中文

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

问题描述

前端页面内容输入中文,或执行过程中生成的log信息夹带中文,都会报与数据库相关的编码错误的问题。 经查看docker 生成的mysql的数据库编码字符集默认是latin, 不是utf-8,需要修改数据库编码字符集,除了修改数据库的编码,还需要修改数据表,数据表的字段的编码字符集

关于mysql字符集知识

我们创建表的时候,有一个charset字段,同时还会有一个collate字段。 以下文字来自网络,讲的很不错。

COLLATE通常是和数据编码(CHARSET)相关的,一般来说每种CHARSET都有多种它所支持的COLLATE,并且每种CHARSET都指定一种COLLATE为默认值。例如Latin1编码的默认COLLATElatin1_swedish_ciGBK编码的默认COLLATEgbk_chinese_ciutf8mb4编码的默认值为utf8mb4_general_ci

mysql中有utf8utf8mb4两种编码,在mysql中请大家忘记**utf8** ,永远使用**utf8mb4**。这是mysql的一个遗留问题,mysql中的utf8最多只能支持3bytes长度的字符编码,对于一些需要占据4bytes的文字,mysql的utf8就不支持了,要使用utf8mb4才行。

很多COLLATE都带有_ci字样,这是Case Insensitive的缩写,即大小写无关,也就是说"A"和"a"在排序和比较的时候是一视同仁的。selection * from table1 where field1="a"同样可以把field1为"A"的值选出来。与此同时,对于那些_cs后缀的COLLATE,则是Case Sensitive,即大小写敏感的

登录docker mysql

登录可以有多种方式

一种通过docker 容器命令行

如图找到命令行按钮,点击进入命令行终端 image.png 在终端输入登录mysql的命令: mysql -uname -ppwd

image.png

一种通过数据库管理软件

我用的是dbeaver, 注意连接数据库的port要和docker里的port端口保持一致

修改数据库编码

在这里,我直接在dbeaver执行如下语句 第一行是显示mysql当前数据库的字符集设置 其余几行都是设置字符集为utf-8 执行成功后,可以再执行以下show语句验证以下。

show variables like 'character%';
set character_set_database =utf8;
set character_set_results =utf8;
set character_set_server =utf8;
set character_set_system =binary;
SET collation_server = utf8_general_ci;
SET collation_database = utf8_general_ci;

image.png

修改数据表及数据表字段

核心sql语句如下:

'alter table tableName  character set utf8mb4;修改数据表,要指定具体的数据表名
show create tableName ;验证是否修改成功
alter table  tableName   convert to character set utf8 collate utf8_general_ci; 修改数据表字段

批量修改数据表及数据表字段

因为数据表比较多,就写了一个python脚本来批量执行 直接上代码

image.png

猜你喜欢

转载自juejin.im/post/7127218336139575303