標籤:
insert into t1(v1) values(‘cn中國‘);
select * from t1;
1、輸入gbk,互動latin1,資料庫latin1
insert,用戶端把gbk的輸入當成latin1來解釋,傳給服務,服務不需要轉碼,把gbk當成latin1存入資料庫,顯示亂碼。
select,服務不轉碼,返回給用戶端,用戶端latin1當成gbk解釋,顯示正確。
2、輸入gbk,互動latin1,資料庫gbk
insert 報錯:ERROR 1366 (HY000): Incorrect string value: ‘\xD6\xD0\xB9\xFA‘ for column ‘v1‘ at row 1
原因是:用戶端把gbk的輸入當成latin1來解釋,傳給服務,服務轉碼,把latin1轉化為gbk,出錯。
3、輸入gbk,互動latin1,資料庫utf8
和1一樣,這是因為utf8英文字元一個位元組,多位元組字元三個位元組。
4、輸入gbk,互動gbk,資料庫latin1
insert 報錯:ERROR 1366 (HY000): Incorrect string value: ‘\xD6\xD0\xB9\xFA‘ for column ‘v1‘ at row 1
原因是:用戶端把gbk的輸入當成gbk來解釋,傳給服務,服務把gbk轉化為latin1,轉化失敗。
5、輸入gbk,互動gbk,資料庫gbk
insert,用戶端把gbk的輸入當成gbk來解釋,傳給服務,服務不需要轉碼,直接存入資料庫,存入資料庫正常。
select,服務不轉碼,返回給用戶端,用戶端gbk當成gbk解釋,顯示正確。
6、輸入gbk,互動gbk,資料庫utf8
insert,用戶端把gbk的輸入當成gbk來解釋,傳給服務,服務把gbk轉成utf8,存入資料庫,存入資料庫正常。
select,服務把utf8轉成gbk,返回給用戶端,用戶端gbk當成gbk解釋,顯示正確。
7、輸入gbk,互動utf8,資料庫latin1
insert 報錯:ERROR 1366 (HY000): Incorrect string value: ‘\xD6\xD0\xB9\xFA‘ for column ‘v1‘ at row 1
原因是:用戶端把gbk的輸入當成utf8來解釋,解釋錯誤。
8、輸入gbk,互動utf8,資料庫gbk
同7
9、輸入gbk,互動utf8,資料庫utf8
同7
考慮下面的情況,輸入gbk,互動gbk,資料庫gbk,插入一條記錄,查詢回來正常。現在把互動改成utf8,會出現什麼問題?
mysql> select * from t1;
+--------+
| v1 |
+--------+
| cn中國 |
+--------+
1 row in set (0.00 sec)
mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+----------+
| v1 |
+----------+
| cn涓浗 |
+----------+
1 row in set (0.00 sec)
這是因為把utf8的中國,當成gbk解釋,就是顯示涓浗,也就是說,他們對應的Id是一樣的。反過來,也是一樣,把gbk的涓浗當成utf8解釋,就是中國,如下:
mysql> insert into t1(v1) values(‘cn涓浗‘);
Query OK, 1 row affected (0.08 sec)
mysql> select * from t1;
+----------+
| v1 |
+----------+
| cn涓浗 |
| cn涓浗 |
+----------+
2 rows in set (0.00 sec)
mysql> set names gbk;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t1;
+--------+
| v1 |
+--------+
| cn中國 |
| cn中國 |
+--------+
2 rows in set (0.00 sec)
mysql 編碼測試