問題描述
前端頁面内容輸入中文,或執行過程中生成的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語句驗證以下。
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;
修改資料表及資料表字段
核心sql語句如下:
'alter table tableName character set utf8mb4;修改資料表,要指定具體的資料表名
show create tableName ;驗證是否修改成功
alter table tableName convert to character set utf8 collate utf8_general_ci; 修改資料表字段
批量修改資料表及資料表字段
因為資料表比較多,就寫了一個python腳本來批量執行
直接上代碼