2012-11-14 98 views
0

我將它插入(我們稱之爲foo)的mysql表爲latin1字符編碼(通過顯示的命令How do I see what character set a MySQL database/table/column is?顯示),我的數據庫在顯示後有以下結果變量:拉丁語1字符集表不是編碼拉丁語中的字符編碼

| character_set_client     | latin1                     | 
| character_set_connection    | latin1                     | 
| character_set_database     | latin1 

在富我有存儲在與所述串foo®一個varchar(255)山口的條目,並且當我在十六進制查看它表明它是在UTF8(666F6FC2AE)編碼。從mysql提示符運行選擇查詢顯示我foo®。但是,當我插入相同的字符串編碼在latin1 666F6FAE我得到一個foo ,當我在同一個mysql命令提示符下運行一個選擇。爲什麼我在我的latin1表中使用utf8編碼的數據,爲什麼我無法將latin1編碼的數據插入到我的表中?

回答

0

你的命令行客戶端似乎使用UTF-8來顯示/輸入/輸出。 666F6FC2AE不是拉丁語-1列中的UTF-8編碼值,而是「fooÂ」的拉丁語-1代碼。從CLI返回數據庫,您的CLI將latin-1數據解釋爲UTF-8,並顯示「foo®」。

舉例說明:

  • CLI在UTF-8
  • 操作輸入 「foo®」 的CLI,這是66 6F 6F C2AE
  • 數據庫連接設置爲Latin-1的
  • 數據庫將輸入解釋爲latin-1,認爲你想存儲「fooÂ」
  • 列編碼是latin-1,沒問題,數據庫存儲「fooÂ」
  • 你從獲取數據庫中的數據,所有的Latin-1,你回來66 6F 6F C2 AE
  • CLI將此解釋爲UTF-8,顯示 「foo®」

您需要將連接的編碼設置爲utf8,因爲你的客戶端發送UTF-8。這或者說服你的CLI使用Latin-1,這可能會更不方便/導致更多的副作用。