天天看點

記一次mysql中文字元亂碼的問題排查

今天開發反應兩樣的程式往一個庫裡面插入資料正常,往另外一個庫裡面插入資料有亂碼。第一反應就是兩個資料庫關于字元集的配置不一樣。

在兩個庫分别檢視參數:

show variables like "%char%";

+--------------------------+------------------------------------------+

| Variable_name            | Value                                    |

| character_set_client     | utf8                                     |

| character_set_connection | utf8                                     |

| character_set_database   | utf8                                     |

| character_set_filesystem | binary                                   |

| character_set_results    | utf8                                     |

| character_set_server     | latin1                                   |

| character_set_system     | utf8                                     |

| character_sets_dir       | /usr/local/mysql/share/charsets/ |

>show variables like "%char%";

| character_set_server     | utf8                                     |

可以看到character_set_server的參數配置不一樣,于是将有問題的那個庫配置成utf8,開發再次測試的時候表示還有亂碼問題,這時想起來校驗字元集沒有改,于是分别檢視兩邊校驗字元集的差異:

>show variables like "%coll%";

+----------------------+-------------------+

| Variable_name        | Value             |

| collation_connection | utf8_general_ci   |

| collation_database   | utf8_general_ci   |

| collation_server     | latin1_swedish_ci |

+----------------------+-----------------+

| Variable_name        | Value           |

| collation_connection | utf8_general_ci |

| collation_database   | utf8_general_ci |

| collation_server     | utf8_general_ci |

可以看到collation_server 參數設定不一緻,于是把這個參數也改成了utf8,再次測試的時候資料顯示正常。

mysql支援多個層次的字元集設定:

服務層(server)、資料庫層(database)、資料表(table)、字段(column)、連接配接(connection)、結果集(result)

優先級:server > database > table > column

為了避免出現因字元不一緻導緻的中文亂碼的問題,最好就是将字元集全部設定成一樣的。

另外提一下skip-character-set-client-handshake這個參數,可以通過開啟這個參數來過濾用戶端設定的字元集

本文轉自 emma_cql 51CTO部落格,原文連結:http://blog.51cto.com/chenql/1975678