2010-08-12 24 views
5

He declarado un campo en mi mesa INNODB/MySQL comoEs "VARCHAR (255) CHARACTER SET utf8" de 255 bytes o 255 caracteres

VARCHAR(255) CHARACTER SET utf8 NOT NULL 

sin embargo al insertar mis datos se trunca en 255 caracteres no bytes . Este podría cortar el punto de código de dos mordidas finalizado i texto enfatizado n dos dejando un carácter no válido. Alguna idea de lo que podría estar haciendo mal

EDIT:

Un ejemplo de sesión es así

mysql> update channel set comment="ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩᚱ᛫ᛞᚱᛁᚻᛏᚾᛖ᛫ᛞᚩᛗᛖᛋ᛫ᚻᛚᛇᛏᚪᚾ᛬x" where id = 1; 
Query OK, 0 rows affected, 1 warning (0.00 sec) 
Rows matched: 1 Changed: 0 Warnings: 1 

mysql> select id, channelName, comment from channel; 
+----+-------------+------------------------------------------------------------------------------------------ 
| id | channelName | comment                                                               | 
+----+-------------+----------------------------------------------------------------------------------------- 
| 1 | foo   | ᚠᛇᚻ᛫ᛒᛦᚦ᛫ᚠᚱᚩᚠᚢᚱ᛫ᚠᛁᚱᚪ᛫ᚷᛖᚻᚹᛦᛚᚳᚢᛗ ᛋᚳᛖᚪᛚ᛫ᚦᛖᚪᚻ᛫ᛗᚪᚾᚾᚪ᛫ᚷᛖᚻᚹᛦᛚᚳ᛫ᛗᛁᚳᛚᚢᚾ᛫ᚻᛦᛏ᛫ᛞᚫᛚᚪᚾᚷᛁᚠ᛫ᚻᛖ᛫ᚹᛁᛚᛖ᛫ᚠᚩ�� | 
+----+-------------+----------------------------------------------------------------------------------------- 
1 row in set (0.00 sec) 

a través de mysql-admin miro el campo de comentarios y veo que sí es VARCHAR (255) y utiliza "UTF-8 Unicode"

del comando

show full columns from channel 

consigo

+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+ 
| Field      | Type    | Collation  | Null | Key | Default | Extra   | Privileges      | Comment | 
+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+ 
| id       | int(11)   | NULL   | NO | PRI | NULL | auto_increment | select,insert,update,references |   | 
| channelName     | varchar(255)  | utf8_general_ci | NO |  | NULL |    | select,insert,update,references |   | 
| comment      | varchar(255)  | utf8_general_ci | NO |  | NULL |    | select,insert,update,references |   | 
+-----------------------------+------------------+-----------------+------+-----+---------+----------------+---------------------------------+---------+ 

mysql> SHOW VARIABLES LIKE 'juego_caracteres%'

+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | latin1      | 
| character_set_connection | latin1      | 
| character_set_database | latin1      | 
| character_set_filesystem | binary      | 
| character_set_results | latin1      | 
| character_set_server  | latin1      | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
+0

¿Qué versión de mySQL estás usando? –

Respuesta

2

Esta es una puñalada en la oscuridad, pero ¿está utilizando UTF-8 como la conexión y los juegos de caracteres del cliente? Emita SHOW VARIABLES LIKE 'character_set%' y vea si le dice UTF-8 o latin-1.

Tal vez si está utilizando los juegos de caracteres de conexión/cliente incorrectos, los bytes UTF-8 se reinterpretan como caracteres de un solo byte y se almacenan de esa manera en la base de datos.

+0

He actualizado la pregunta con el resultado de lo que me pediste. ¿Esto ayuda? – bradgonesurfing

+0

Su juego de caracteres de conexión y conjunto de caracteres del cliente son ambos 'latin1'. Intente lo siguiente: emita 'SET NAMES 'utf8'' y luego vuelva a intentar la instrucción de inserción que no funcionó. Si funciona, entonces el problema es la conexión y los juegos de caracteres del cliente. – Hammerite

+0

establecer NOMBRES 'utf8' de hecho resolvió el problema. ¿Qué hizo exactamente eso? – bradgonesurfing

7

De acuerdo con la manual, que debe estar bien:

MySQL interpreta las especificaciones de longitud en la columna de caracteres definiciones en unidades de caracteres. (Antes de MySQL 4.1, las longitudes de las columnas se interpretaban en bytes). Esto se aplica a los tipos CHAR, VARCHAR y TEXT.

¿Está usando una versión anterior a la 4.1 de mySQL?

+0

Oh, interesante. Uno de nosotros está equivocado. Me sorprendería saber que MySQL usa personajes aquí. Buscando dentro. – scy

+0

@Scytale su explicación tiene más sentido, y yo también hubiera asumido que usa bytes. El cambio a los caracteres puede tener que ver con el hecho de que los campos 'VARCHAR()' pueden exceder 255 bytes desde 4.1 –

+4

Wow. Lo siento, no te creí. De hecho, es personajes para MySQL ≥ 4.1. Eliminaré mi respuesta incorrecta. (Para el registro: El cálculo de almacenamiento para lograr los límites de caracteres es el siguiente: M x w bytes, 0 <= M <= 255, donde w es el número de bytes requerido para el carácter de longitud máxima en el juego de caracteres). – scy

Cuestiones relacionadas