2008-09-16 18 views
11

Estoy trabajando con una base de datos bastante simple, desde una aplicación Java. Estamos tratando de insertar aproximadamente 200,000 de texto a la vez, usando el adaptador estándar JDBC mysql. Recibimos intermitentemente un com.mysql.jdbc.MysqlDataTruncation: Truncamiento de datos: datos demasiado largos para el error de columna.Error de truncamiento de datos MySQL

El tipo de columna es longtext y la intercalación de la base de datos es UTF-8. El error aparece usando ambos motores de tabla MyISAM e InnoDB. El tamaño máximo de paquete se ha establecido en 1 GB tanto en el lado del cliente como en el del servidor, por lo que tampoco debería estar causando problemas.

Respuesta

4

Bueno, puede hacer que ignore el error haciendo un INSERTAR IGNORAR que simplemente truncará los datos e insertará de todos modos. (De http://dev.mysql.com/doc/refman/5.0/en/insert.html)

Si utiliza la palabra clave IGNORE, los errores que se producen durante la ejecución de la sentencia INSERT se tratan como advertencias lugar. Por ejemplo, sin IGNORE, una fila que duplica un índice UNIQUE existente o el valor PRIMARY KEY en , la tabla provoca un error de clave duplicada y la instrucción se anula. Con IGNORE, la fila aún no está insertada, pero no se emite ningún error. Las conversiones de los datos que activarían los errores abortan la declaración si IGNORE no está especificado en . Con IGNORE, los valores inválidos se ajustan a los valores más cercanos y se inserta ; las advertencias se producen pero la declaración no aborta.

2

Me parece que está tratando de poner demasiados bytes en una columna. Anoche encontré un error muy similar con MySQL debido a un error en mi código. Me refiero a hacer

foo.status = 'inactive' 

pero en realidad había escrito

foo.state = 'inactive' 

Dónde foo.state se supone que es un código de dos caracteres para un Estado de Estados Unidos (varchar (2)). Tengo el mismo error que tú. Puede buscar una situación similar en su código.

10

Comprueba que tus datos UTF-8 sean todos de 3 bytes Unicode. Si tiene caracteres de 4 bytes (legales en Unicode y Java, ilegales en MySQL 5), puede arrojar este error cuando intente insertarlos. Este es un issue that should be fixed en MySQL 6.0.

+0

¿Cómo puedo comprobar que mis datos UTF-8 es todos los 3 bytes byte Unicode? – JAVAGeek

+0

@JAVAGeek: Buena pregunta, que probablemente debería formularse por separado. Hay varias formas. Fuera de mi cabeza, una forma que podría funcionar en Java es comprobar si hay puntos de código en la cadena que están representados por más de un carácter, como este: 's.length() == s.toCharArray () .length'. Si eso es cierto, 's' tiene el mismo número de puntos de código y caracteres, por lo que solo habrá caracteres BMP que estén representados en UTF-8 hasta en 3 bytes. – Avi

1

Acabo de solucionar este problema y lo resolví eliminando todos los caracteres ascii no estándar en mi texto (siguiendo las instrucciones UTF-8 anteriores).

Tuve el problema en un sistema Debian 4, Java 5; pero el mismo código funcionó bien con Ubuntu 9.04, Java 6. Tanto MySql plazo 5.

4

en MySQL se puede utilizar MEDIUMTEXT o LONGTEXT tipo de campo para los datos de texto grandes

Cuestiones relacionadas