2012-05-01 6 views
5

Dokumentacja MySQL mówi, że od 5,0 długości varchar odnoszą się do jednostek znaków, a nie bajtów. Niedawno natknąłem się na problem polegający na tym, że podczas wstawiania wartości, które powinny pasować do kolumny varchar, która została wyznaczona, otrzymywałem ostrzeżenia o danych.Wielkość kolumny MySQL UTF8 varchar

I replikowane ten problem z prostym stole 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) 

Następnie dodaje wielokrotność 10 znaków wartości o różnej ilości znaków 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) 

Myślę, że to pokazuje, że rozmiar varchar jest nadal definiowany w bajtach lub przynajmniej nie jest dokładny w jednostkach znaków.

Pytanie brzmi, czy rozumiem poprawnie dokumentację i czy jest to błąd? Czy błędnie interpretuję dokumentację?

+1

Nie pomaga ci to w najmniejszym, ale [na sqlfiddle] (http://sqlfiddle.com/#!2/829b8/2), który twierdzi, że jest 5.5.20, jeden nie cierpi z powodu tego problemu. Być może był to błąd, który został naprawiony (przeszukano, ale nie znalazłem raportu o błędzie). – eggyal

+0

Ten sam problem występuje w wersji 5.5.19, więc może to być wersja, która została naprawiona. Sprawdzanie uwag do wydania nie zawiera żadnej wzmianki o varcharach ani UTF8 – sreimer

Odpowiedz

7

To prawda, że ​​rozmiary VARCHAR i CHAR są uwzględniane w postaciach, a nie w bajtach.

Udało mi się odtworzyć twój problem, kiedy ustawiłem zestaw znaków połączenia na latin1 (pojedynczy bajt).

Upewnij się, że twoja postać ustawić połączenie ustawione na UTF-8 przed uruchomieniem kwerendy wstawiania za pomocą następującego polecenia:

SET NAMES utf8 

Jeśli tego nie zrobi, o UTF8 znak dwubajtowa dostanie wysłane jako dwa znaki jednobajtowe.

Możesz rozważyć zmianę swojego default client character set.

+0

. To był rzeczywiście problem. Spodziewałbym się, że wynikowy rekord zostanie wyświetlony niepoprawnie, jeśli użyto nieprawidłowego zestawu znaków. – sreimer