2012-05-01 71 views
5

MySQL文檔說,自5.0起,varchar長度引用字符單位,而不是字節。但是,最近我遇到了一個問題,那就是在插入適合指定的varchar列的值時,我正在截取數據警告。MySQL UTF8 varchar列大小

我在V5.1複製這個問題上用一個簡單的表格

mysql> show create table test\G 
*************************** 1. row *************************** 
Table: test 
Create Table: CREATE TABLE `test` (
    `string` varchar(10) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
1 row in set (0.00 sec) 

我然後插入多個10個字符值具有不同的UTF8字符數量

mysql> insert into test (string) values 
    -> ('abcdefghij'), 
    -> ('ãáéíçãáéíç'), 
    -> ('ãáéíç67890'), 
    -> ('éíç4567890'), 
    -> ('íç34567890'); 
Query OK, 5 rows affected, 4 warnings (0.06 sec) 
Records: 5 Duplicates: 0 Warnings: 4 

mysql> show warnings; 
+---------+------+---------------------------------------------+ 
| Level | Code | Message          | 
+---------+------+---------------------------------------------+ 
| Warning | 1265 | Data truncated for column 'string' at row 2 | 
| Warning | 1265 | Data truncated for column 'string' at row 3 | 
| Warning | 1265 | Data truncated for column 'string' at row 4 | 
| Warning | 1265 | Data truncated for column 'string' at row 5 | 
+---------+------+---------------------------------------------+ 

mysql> select * from test; 
+------------+ 
| string  | 
+------------+ 
| abcdefghij | 
| ãáéíç | 
| ãáéíç | 
| éíç4567 | 
| íç345678 | 
+------------+ 
5 rows in set (0.00 sec) 

我認爲,這表明varchar大小仍然以字節或至少定義,在字符單位中不準確。

問題是,我正確理解文檔,這是一個錯誤嗎?還是我誤解了文檔?

+1

不是說它對你稍有幫助,而是[在sqlfiddle]上(http://sqlfiddle.com/#!2/829b8/2),聲稱它是5.5.20,不會遇到這個問題。也許這是一個已經修復的錯誤(我已經搜索過,但沒有找到錯誤報告)。 – eggyal

+0

5.5.19中存在相同的問題,因此可能是其修復的版本。發行說明的檢查顯示沒有提及varchars或UTF8 – sreimer

回答

7

的確,VARCHAR和CHAR大小被認爲是字符而不是字節。

當我將連接字符集設置爲latin1(單字節)時,我能夠重新創建您的問題。

確保您設置連接字符集設置爲UTF-8與運行以下命令插入查詢之前:

SET NAMES utf8 

如果你不這樣做,兩個字節的UTF8字符將被髮送作爲兩個單字節字符。

你可能會考慮改變你的default client character set

+0

這確實是問題所在。如果使用不正確的字符集,我會期望得到的記錄顯示不正確。 – sreimer