MYSQL的字元問題 續《引用》

2021-08-23 14:00:55 字數 1701 閱讀 2821

三個mysql的系統變數是:

①character_set_client,終端字符集,告訴server客戶端提交的sql語句的編碼格式

②character_set_connection,連線字符集,是伺服器翻譯sql語句時用到的編碼格式

③character_set_results,返回的結果集的字符集,是伺服器返回結果集之前把結果集轉換成的編碼格式

在mysql終端通過執行命令 show variables like 'char%'; 可以檢視這幾個變數的值。這三個變數通常都設定為同一種字符集,用命令set names [charset name];就可以修改這三個變數的值。一般來說,只要你設定了能夠表示你的資料的字符集,你查詢的結果都可以在終端正確顯示。比如你在資料庫中存入了中文資料,不管存入時使用的什麼字符集,你在終端即可以用set names命令設定為utf8,也可以設定為gbk編碼,只要你的終端顯示的字符集和你的設定一致就可以正確處理中文。

舉個例子,使用的表t1是utf8編碼,表中的字段c1繼承了這個編碼,表建立如下

mysql> create table t1 ( c1 text not null ) character set utf8;

用的字元是漢字「範」,gbk編碼為b7 b6,utf8編碼為e8 8c 83

用下面的sql語句插入資料:

mysql> insert into t1 values ('範');

1、如果終端設定為utf8,並且執行了 set names utf8,那麼插入到資料庫中的就是「範」這個字的utf8編碼,這個過程中mysql不需要做編碼轉換。寫入資料庫的內容可以通過執行 select hex( c1 ) from t1;得到資料的十六進製制編碼來驗證。

2、如果終端設定為utf8,並且執行了set names gbk,那麼執行完這個插入操作後,寫入的二進位制資料是e9 91 bc,這是漢字「鑼」的utf8編碼。這是因為,終端輸入的「範」用的是utf8編碼,而伺服器以為終端傳送過來的內容是gbk編碼,所以在向t1表中插入的時候進行了一次gbk到utf8的轉換,結果當然是錯誤的。

3、如果終端設定為gbk,並且執行了set names gbk,那麼執行完插入操作後,寫入t1的依然是「範」這個字的utf8編碼。插入過程中,終端輸入的是「範」的gbk編碼b7 b6,伺服器被告知終端發過來的sql語句是gbk編碼(由character_set_client指定),所以在插入資料前做了一次gbk到utf8的編碼轉換。

4、如果終端設定為gbk,並且執行了set names utf8,那麼執行完插入操作後,mysql會報出乙個資料被截斷的警告。實際上,輸入終端的是「範」這個字元的gbk編碼b7 b6,而伺服器被告知客戶端發過來的sql語句是utf8編碼,所以在執行過程中沒有做轉碼,直到插入資料的時候,發現b7 b6不符合utf8的編碼規則,給出了警告資訊,實際插入的資料是3f 3f,也就是兩個問號。

查詢的時候是同樣的道理,mysql也是根據set names設定的字符集來對返回給客戶端的結果集做相應的編碼轉換,如果轉換的結果和終端顯示的字符集一致,就能正確顯示,如果不一致就是亂碼。

結論是,只要終端的字符集和set names指定的字符集一致就可以讓mysql在處理過程中執行正確的轉碼並且正確地顯示。

另外,如果通過程式操作mysql資料庫, 那麼也需要事先執行set names命令來指定程式希望輸出的字符集。比如,用程式從乙個utf8編碼的資料庫向另外乙個gbk編碼的資料庫進行資料遷移,在選取源資料庫資料之前,需要執行set names gbk,才能取到gbk編碼的資料。

mysql問題二(效能優化續)

一 需要選擇合適的資料庫引擎 mysql有兩個資料庫引擎,分別是mylsam和innodb,各有優缺點。mylsam適用於一些需要大量查詢的應用,但是對於需要大量寫的功能的應用不是很好。甚至你只要update乙個字段,表就會鎖起來。別的程序即便是讀操作也不行,要等到update執行完。innodb在...

mysql字符集問題 mysql字符集問題

我們新建mysql資料庫的時候,需要指定資料庫的字符集,一般我們都是選擇utf8這個字符集,但是還會又乙個utf8mb4這個字符集,好像和utf8有聯絡,今天就來解析一下這兩者的區別。起源mysql在5.5.3之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來相容...

mysql字符集問題 mysql字符集問題

用show variables like char 檢視mysql的引數,結果應如下 mysql show variables like char variable name value character set client gbk character set connection gbk ch...