天天看點

解決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腳本來批量執行

直接上代碼