问题描述

前端页面内容输入中文,或执行过程中生成的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的命令: mysql -uname -ppwd

解决docker mysql不能写入中文_数据库_02

一种通过数据库管理软件

我用的是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不能写入中文_数据库_03

修改数据表及数据表字段

核心sql语句如下:

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

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

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

解决docker mysql不能写入中文_Python_04