MySQL 字符集與亂碼與collation設定的問題?
來源:AustinDatabases
問題是這樣的,最近有同學問關於MySQL 的字元亂碼的問題,說從一個資料庫到另一個資料庫,配置相同,但是為什麼這個資料庫的中文就是中文,到另一個資料庫就是亂碼?
說到這個問題,我們先對MySQL的字符集的配置部分進行一個系統化的分析,這裡我們那下面的這些配置來詳細的說說字元和字元亂碼的問題
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8mb4
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8mb4
character_set_system utf8mb3
character_set_client 這裡官方的解釋是,客戶端傳送的語句時所用的字符集,這裡的意思就是MySQL 或類MySQL的資料庫產品,會認為在接受到客戶端的發來的資訊後,客戶端的編碼是 utf8mb4 .
同時MySQL如何處理這些發來的資料要用 character_set_connection 中設定的透過character_set_connection 中設定的字符集來進行資料的處理,最後character_set_results 是最後一個環節,在資料處理完畢後,將資料返回給客戶端的字符集編碼。
character_set_database
character_set_server
那麼什麼情況會導致輸入的資料的字元到了資料庫裡面是錯誤的
案例1
JDBC中使用的指定的字符集不對,導致MySQL接受到的資料與預設客戶的字符集不對,導致的亂碼。這裡需要注意,在JDBC URL中需要使用connector/J 8.020 後的JDBC 才能支援utf8mb4 ,否則只能支援到utf8。
同理當character_set_results的字符集和JDBC的應用字符集設定的不同,也會導致傳回應用的字元是亂碼的情況。
String url = "jdbc:mysql://127.0.0.1:3306/shop?useUnicode=true&characterEncoding=utf8mb4&autoReconnect=true&allowMultiQueries=true";
所以必須去確認JDBC 設定的字符集和你的MySQL的 character_set_client 和 character_set_result 的字符集是一致的。這裡稍微模擬一下,character_set_result 和 character_set_client 的字符集不一致導致的亂碼的問題。
mysql> select * from test;
+----+--------+--------+
| id | name | title |
+----+--------+--------+
| 1 | 小李 | 嘩蠧 |
| 2 | 小李 | 嘩蠧 |
+----+--------+--------+
2 rows in set (0.00 sec)
mysql> set character_set_results = 'big5';
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql>
mysql> insert into test (name,title) values ('小李','嘩蠧');
Query OK, 1 row affected (0.00 sec)
mysql>
mysql>
mysql> select * from test;
+----+-------+-------+
| id | name | title |
+----+-------+-------+
| 1 | ?ʡ剠| ??? |
| 2 | ?ʡ剠| ??? |
| 3 | ?ʡ剠| ??? |
+----+-------+-------+
3 rows in set (0.00 sec)
所以在此基礎上,需要正確設定這些引數,保證資料庫和客戶端在字符集設定上是一致的。
說完字符集,下面的說說字元比較規則的問題,字元在進行資料處理中需要進行時間,collation_connection 是MySQL伺服器的一個系統變數,用於指定當前連線字元比較的規則,字元比較規則包含字符集和校對規則,決定了在執行字元比較和排序時要使用的規則,我們可以透過show varaibles like '%coll%' 來調取當前與collation有關的值。
collation_connection utf8mb4_0900_ai_ci
collation_database utf8mb4_general_ci
collation_server utf8mb4_general_ci
default_collation_for_utf8mb4 utf8mb4_0900_ai_ci
mysql>
mysql> show variables like 'coll%';
+----------------------+--------------------+
| Variable_name | Value |
+----------------------+--------------------+
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8mb4_general_ci |
| collation_server | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)
mysql> select 'a' = 'A';
+-----------+
| 'a' = 'A' |
+-----------+
| 1 |
+-----------+
1 row in set (0.01 sec)
mysql> set collation_connection = utf8_bin;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> select 'a' = 'A';
+-----------+
| 'a' = 'A' |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
mysql>
最後總結MySQL 的字符集和字元排序的問題,
1 弄清楚當前資料庫的字符集和字元排序的設定
2 出現亂碼去發現當前的資料的字符集和資料庫連結和結果的字符集與應用的設定是否匹配一致。
3 排序規則不能輕易變換,輕易變換後會可能會出現業務邏輯錯誤的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027826/viewspace-2991740/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql字符集與亂碼MySql
- MySQL字符集亂碼與解決方案MySql
- mysql字符集檢視與設定MySql
- 【nls_character】中文字元亂碼問題與字符集的修改字元
- mysql亂碼問題MySql
- mysql 字符集亂碼探究MySql
- 常見php與mysql中文亂碼問題解決辦法PHPMySql
- 設定spacevim字型顯示亂碼問題
- 設定SecureCRT配色和解決亂碼問題Securecrt
- 【勝通 】mysql字符集與校驗規則的設定MySql
- mysql5.7.22設定中文編碼-解決亂碼問題LinuxMySqlLinux
- mysql 5 資料庫匯出與字符集的問題。MySql資料庫
- MySQL字符集和校對規則(Collation)MySql
- PostgreSQL 字符集烏龍導致資料查詢排序的問題,與 MySQL 穩定 "PG不穩定"排序MySql
- mysql亂碼的問題如何解決MySql
- JBOSS下的JSP頁面字符集亂碼問題JS
- 設定Mysql字符集MySql
- mysql字符集設定MySql
- 關於客戶端字符集與亂碼的困擾客戶端
- MySQL:亂碼問題處理流程MySql
- MySql中文亂碼問題解決MySql
- 解決MySQL中文亂碼問題MySql
- Java,MySQL中文亂碼問題求教JavaMySql
- PHP顯示MySQL亂碼問題PHPMySql
- MYSQL亂碼問題解決方法MySql
- 字串的encode與decode解決亂碼問題字串
- ofbiz中mysql的中文亂碼問題!MySql
- 字符集的理解與亂碼的解決 必須作業系統字符集作業系統
- PHP和mySQL的字符集編碼問題(1)PHPMySql
- MySQL字符集和校對規則(character set & collation)MySql
- mysql亂碼?一勞永逸修改mysql字符集!MySql
- MySQL 檢視與修改預設字符集MySql
- mysql亂碼現象及對字符集的理解MySql
- 解決Mysql匯入亂碼問題MySql
- MySQL客戶端中文亂碼問題。MySql客戶端
- Navicat for mysql 顯示中文亂碼問題MySql
- mysql與jsp亂碼解決方法MySqlJS
- mysql 字符集造成的效能問題MySql