2012-05-01 34 views
5

La documentación de MySQL dice que desde 5.0, las longitudes de varchar se refieren a las unidades de caracteres, no a los bytes. Sin embargo, recientemente me encontré con un problema en el que recibía advertencias de datos truncadas al insertar valores que deberían haber encajado en la columna varchar que se designó.MySQL UTF8 varchar columna tamaño

que replican este tema con una simple tabla en 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) 

que a continuación se inserta múltiples valores de 10 personajes con diferentes cantidades de caracteres 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) 

creo que esto demuestra que la El tamaño de varchar todavía está definido en bytes o, al menos, no es preciso en unidades de caracteres.

La pregunta es, ¿entiendo la documentación correctamente y es esto un error? ¿O estoy malinterpretando la documentación?

+1

No es que te ayude en lo más mínimo pero [en sqlfiddle] (http://sqlfiddle.com/#!2/829b8/2), que dice ser 5.5.20, uno no sufre este problema. Tal vez fue un error que se solucionó desde entonces (he buscado, pero no he localizado un informe de error). – eggyal

+0

Existe el mismo problema en 5.5.19, por lo que puede ser la versión que se arregló. Una verificación de las notas de la versión no muestra ninguna mención de varchar o UTF8 – sreimer

Respuesta

7

Es cierto que los tamaños VARCHAR y CHAR se consideran en caracteres, no en bytes.

Pude volver a crear su problema cuando establecí mi conjunto de caracteres de conexión en latin1 (byte simple).

Asegúrese de establecer el carácter de establecimiento de conexión a UTF8 antes de ejecutar la consulta de inserción con el siguiente comando:

SET NAMES utf8 

Si no hace esto, un carácter UTF8 de dos bytes conseguirá enviado como dos caracteres de un solo byte.

Quizás desee cambiar su default client character set.

+0

Este fue de hecho el problema. Hubiera esperado que el registro resultante se mostrara incorrectamente si se usaba un juego de caracteres incorrecto. – sreimer

Cuestiones relacionadas