天天看点

解决docker mysql不能写入中文

问题描述

前端页面内容输入中文,或执行过程中生成的log信息夹带中文,都会报与数据库相关的编码错误的问题。

经查看docker 生成的mysql的数据库编码字符集默认是latin, 不是utf-8,需要修改数据库编码字符集,除了修改数据库的编码,还需要修改数据表,数据表的字段的编码字符集

关于mysql字符集知识

我们创建表的时候,有一个charset字段,同时还会有一个collate字段。

以下文字来自网络,讲的很不错。

​COLLATE​

​​通常是和数据编码(​

​CHARSET​

​​)相关的,一般来说每种​

​CHARSET​

​​都有多种它所支持的​

​COLLATE​

​​,并且每种​

​CHARSET​

​​都指定一种​

​COLLATE​

​​为默认值。例如​

​Latin1​

​​编码的默认​

​COLLATE​

​​为​

​latin1_swedish_ci​

​​,​

​GBK​

​​编码的默认​

​COLLATE​

​​为​

​gbk_chinese_ci​

​​,​

​utf8mb4​

​​编码的默认值为​

​utf8mb4_general_ci​

​。

mysql中有​

​utf8​

​​和​

​utf8mb4​

​两种编码,在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 容器命令行

如图找到命令行按钮,点击进入命令行终端

解决docker mysql不能写入中文

在终端输入登录mysql的命令: mysql -uname -ppwd

解决docker mysql不能写入中文

一种通过数据库管理软件

我用的是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;      
解决docker mysql不能写入中文

修改数据表及数据表字段

核心sql语句如下:

'alter table tableName  character set utf8mb4;修改数据表,要指定具体的数据表名

show create tableName ;验证是否修改成功

alter table  tableName   convert to character set utf8 collate utf8_general_ci; 修改数据表字段

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

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

直接上代码