问题描述
前端页面内容输入中文,或执行过程中生成的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 容器命令行
如图找到命令行按钮,点击进入命令行终端
在终端输入登录mysql的命令: mysql -uname -ppwd
一种通过数据库管理软件
我用的是dbeaver, 注意连接数据库的port要和docker里的port端口保持一致
修改数据库编码
在这里,我直接在dbeaver执行如下语句 第一行是显示mysql当前数据库的字符集设置 其余几行都是设置字符集为utf-8 执行成功后,可以再执行以下show语句验证以下。
修改数据表及数据表字段
核心sql语句如下:
'alter table tableName character set utf8mb4;修改数据表,要指定具体的数据表名
show create tableName ;验证是否修改成功
alter table tableName convert to character set utf8 collate utf8_general_ci; 修改数据表字段
批量修改数据表及数据表字段
因为数据表比较多,就写了一个python脚本来批量执行 直接上代码