code
存入過程:
----------------------
頁面 連線 儲存
----------------------
gbk => latin1 => utf-8
---------------
------------- |
| +------- 該過程得到的utf-8是一串不知所云的亂碼,但mysql固執的認為這串碼為utf-8
|+------ mysql將gbk誤認為是latin1
讀取過程:
----------------------
頁面 連線 儲存
----------------------
gbk <= latin1 <= utf-8
---------------
------------- |
| +------- 正是這串亂碼經過逆過程轉換回正確的gbk編碼,只是mysql認為是latin1而已
|+------ mysql將誤認為是latin1的gbk編碼傳回了頁面,剛好得到正確的編碼。
2、情況二
資料庫字段字符集:utf-8
連線字符集:gbk
頁面字符集:gbk
文字描述略。
示意圖:
code
存入過程:
----------------------
頁面 連線 儲存
----------------------
gbk => gbk => utf-8
------------
------------- |
| +------- 該過程得到的utf-8是由gbk轉換而來的,是正確的utf-8編碼
|+------ 頁面字符集等於連線字符集,mysql認為頁面傳遞給它的是gbk編碼,它的想法正好符合事實。
讀取過程:
----------------------
頁面 連線 儲存
----------------------
gbk <= gbk <= utf-8
---------------
------------- |
| +------- 用「utf-8轉gbk函式」將正確的utf-8編碼轉換回gbk
|+------ 頁面字符集等於連線字符集,顯示沒有任何問題。
3、情況三
資料庫字段字符集:gbk
連線字符集:沒有顯式設定,預設為latin1
頁面字符集:gbk
code
存入過程:
----------------------
頁面 連線 儲存
----------------------
gbk => latin1 => gbk
------------
------------- |
| +------- 字元被「latin1轉gbk函式」轉換的成了亂碼,但mysql認為它是gbk,所以工具無法正常顯示。
|+------ mysql認為頁面傳遞給它的是latin1編碼,它將在後續過程中畫蛇添足地將正確的gbk轉換為亂碼。
讀取過程:
----------------------
頁面 連線 儲存
----------------------
gbk <= latin1 <= gbk
---------------
------------- |
| +------- 「gbk轉latin1函式」將亂碼轉換為gbk,但mysql卻認為它們是latin1
|+------ 錯誤的latin1編碼其實是正確的gbk編碼,頁面顯示正常,但工具顯示不正常。
二、字符集之間的轉換
筆者試著將gbk字元誤當作latin1轉換為錯誤的utf-8能成功,逆過程中將亂碼轉換回latin1得到的剛好是正確的gbk
code
$str = "中文測試";
$str_tran = iconv('latin1', 'utf-8', $str);
echo $str_tran; // 顯示亂碼,既不是gbk也不是utf-8和latin1
echo "
-----------
";$str_re_tran = iconv('utf-8', 'latin1', $str_tran);
echo $str_re_tran; // 顯示 「中文測試」
而將gbk字元誤當作utf-8轉換為錯誤的gbk編碼則出現錯誤
code
$str = "中文測試";
#$str_tran = iconv('utf-8', 'gbk', $str); // 錯誤!!!
可見一種編碼是否能被當作另一種編碼被轉換為第三種編碼,取決於編碼的固有屬性,上面我們舉的第乙個例子只是碰巧gbk編碼能被誤當作latin1被轉換為utf-8。如果是如下情況,則資料庫肯定不能正常訪問資料。
gbk => utf-8 => gbk(未實驗)
三、結論
頁面能正常訪問但phpmyadmin不能正常訪問,從嚴格意義上來說應該是一種錯誤,頁面是否能正常訪問取決於連線字符集是否能正常的被轉換為儲存字符集。
要保證頁面能正常訪問,並且工具也能正常使用,一般保持頁面字符集等於或相容連線字符集就可以了。
原文:
連線mysql出現亂碼 MySQL連線時的亂碼問題
昨天用python連線mysql時遇到了乙個錯誤 latin 1 codec can t encode characters in position 36 37 ordinal not in ra.調式乙個多鐘頭才發現原來是編碼的問題,於是檢視mysql的編碼如下 問題就出在這,以上三個設定編碼是g...
解決php連線mysql出現亂碼辦法講解
用phpmyadmin新增mysql資料庫,然後用php運算元據庫出現亂碼的解決辦法 1 確認phpmyadmin用的mysql字符集為utf 8 unicode utf8 mysql連線校對為utf8 general ci,language為中文 chinese simplified 3 在php...
java連線mysql出現亂碼
插入資料時出現亂碼,大致修改點為 1.my.ini中 client 下面新增 default character set utf8 2.my.ini中 mysqld 下面新增 default character set utf8 3.jdbc的url使用 jdbc mysql localhost 3...