2011-12-24 44 views
0

不幸的是我截斷了我的表,當我想導入備份時,我在VARBINARY(24)類型行中遇到了一些問題。Mysql varbinary類型的行和無效字符

這是什麼問題?

我想我的領域,是這樣的:ŔÎĹͳ׼ųÎ070905-121713

但是,當我使用下面的查詢:

UPDATE `proto` 
SET `vname` = 'ŔÎĹͳ׼ųÎ070905-121713 ' 
WHERE `id` = 127; 

查詢是沒有任何錯誤執行,但後來我做的:

SELECT `vname` 
FROM `proto` 
WHERE `id` = 127; 

而且我看到我的vname字段具有以下數據:

c594c38ec4b9c38dc582c397c4bdc4b9c582c38e30373039

,而不是

ŔÎĹͳ׼ųÎ070905-121713

這是什麼問題,爲什麼我不能將我的現場數據設置爲:ŔÎĹͳ׼ųÎ070905-121713

回答

1

當您將二進制數據作爲字符序列傳遞時,可能會引發編碼問題。當你發送「ŔÎĹͳ׼ųÎ070905-121713」時,服務器必須弄清楚你的意思是什麼二進制數據,這取決於爲你的連接選擇的編碼。嘗試檢查它是否正確。一般來說,我更喜歡以十六進制傳遞二進制數據(如x'123AB45CD789EF0123'),但據我所知,您已經有了一個表備份,其中數據表示爲字符,所以這不是一個選項爲你。

+0

如何檢查我的連接編碼? – Cyclone 2011-12-24 14:11:41

+0

這取決於您使用哪種工具與服務器通信......這應該是建立連接時的參數之一。 – 2011-12-24 19:53:42

+0

順便說一句,您還可以檢查您的服務器/數據庫/表的編碼以匹配數據的編碼。 – 2011-12-24 20:20:14

2

您的字符串是一個unicode字符串。它使用utf-8編碼進行編碼,對一個字符可以使用多個字節。所以,你的字符串對應於下列字節序列:

C5 94 C3 8E C4 B9 C3 8D C5 82 C3 97 C4 BD C4 B9 C5 82 C3 8E 30 37 30 39 30 35 2D 31 32 31 37 31 33

您的列被聲明爲VARBINARY(24),因此您的數據不適合列並被截斷。只有24字節存儲:

C5 94 C3 8E C4 B9 C3 8D C5 82 C3 97 C4 BD C4 B9 C5 82 C3 8E 30 37 30 39

這就是你所看到的。

要解決該問題,請將列的類型設置爲VARCHAR(24),以便將限制應用於字符數,而不是字節數。將表格的編碼設置爲「utf-8」。如果你可以設置連接編碼,讓它也是「utf-8」(看起來它已經是「utf-8」)。然後一切都會好的。

如果你不想讓你的列VARCHAR,你可以加倍你的VARBINARY的容量。讓它成爲VARBINARY(48)。但我不推薦這個。儘管大多數24字節utf-8編碼的字符串可以放入48個字節,但其中一些字符串不會(因爲一些外來字符可能需要多於2個字節)。理論上,utf-8中一個字符的長度可以達到6個字節!很少,但......)。如果你使你的列VARCHAR這將是最好的選擇,因爲實際上你把文本,而不是二進制數據。

+0

Aight,謝謝!明天我會試一試。聖誕節快樂! (現在+1)。 – Cyclone 2011-12-24 23:30:09

+0

那麼,我使用phpMyAdmin。我已經將表的編碼設置爲'utf-8_general_ci',並且問題仍然存在,執行以下查詢:'UPDATE items SET name ='ŔÎĹͳ׼ųÎ070905-121713';'。我收到了這樣的警告:'警告:#1265數據在第1行'列名'被截斷,然後我想修改的'name'字段如下所示:'c594c38ec4b9c38dc582c397c4bdc4b9c582c38e30373039'。 (閱讀下一條評論)。 – Cyclone 2011-12-25 13:37:17

+0

您是否按照我的建議將列形式VARBINARY的類型更改爲VARCHAR? – 2011-12-25 22:07:57

相關問題