2012-04-13 133 views
5

Estoy tratando de insertar algunos datos binarios en una base de datos MySQL sin usar declaraciones preparadas. La razón de esto es que concateno miles de declaraciones en una sola inserción una ejecución que una vez. (Exactamente cómo el volcado de MySQL & trabajos de importación)Insertar datos binarios en MySQL (sin PreparedStatement)

He tratado de las siguientes afirmaciones, pero la están fallando todo:

INSERT INTO VALORES my_table (1, 'g = F |} X ', 2);

INSERT INTO my_table VALUES (1, CAST ('g = F | } X ' AS BINARY), 2);

INSERT INTO my_table VALUES (1, CONVERTIR ('g = F | } X ', BINARIO), 2);

INSERT en valores my_table (1, BINARY 'g = F |} X', 2)

El error que consigo es:

truncamiento de datos: los datos com.mysql.jdbc.MysqlDataTruncation demasiado tiempo para la columna 'binary_data' en la fila 1

el código que utilizo para ejecutar la instrucción es simplemente:

conn.createStatement(). ExecuteUpdate (sql);

PreparedStatements funcionan bien (pero son demasiado lentos en este caso)

la cadena real que en la base de datos muestra un poco differet:

g = ÷ DE | ¸} I x £ [

Binary Vista: 67 3d 81 f7 19 f3 46 7c 7d b8 58 8c 10 a3 ec 5b

Java Bytes: 103, 61, -127, -9, 25, -13, 70, 124, -72, 125, 88, -116, 16, -93, -20, 91

¿Podría ser esto algo relacionado con la codificación?

Alguna pista mucho apprecaited, Ro

+3

Los datos binarios se pueden insertar sólo a través de '' PreparedStatement' O CallableStatement' y no posible usando 'Statement' simple. –

+2

¿Sabía que la "optimización" que hizo probablemente sea inútil? El punto de las declaraciones preparadas es que están "precompiladas" por MySQL y que solo le das a MySQL los parámetros. Ya sea que concatenas declaraciones o no, estás enviando miles de valores de todos modos. Y, naturalmente, esto resultó ser un problema ya que no puede insertar fácilmente datos binarios. –

+0

¿Cómo está generando sus declaraciones 'INSERT'? La codificación es importante, pero también debes preocuparte por el escape correcto (por ejemplo, si los datos binarios tienen un '' '). También verifica tu JDBC [parámetros de conexión] (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html), como 'useUnicode' y' characterEncoding ¿? –

Respuesta

11

encontrado la solución .... Aunque no es algo que vi documentado en ninguna parte .... .

Puede insertar datos binarios directamente escribiendo los bytes convertidos a HEX y precedido por 0x

Por ejemplo:

INSERT INTO my_table VALUES (1,0x19c0300dc90e7cedf64703ed8ae8683b,2); 
+1

No me di cuenta de que mysql decodifica automáticamente el hexadecimal de esa manera, gracias por esta útil publicación. – fabspro

+1

La notación x'19c0300dc90e7cedf64703ed8ae8683b 'funciona, también. Todo esto está documentado en §9.1.4 del Manual de referencia de MySQL. – olefevre

2

Una declaración preparada es sin duda el método más rápido. La razón por la que le parece demasiado lento podría deberse a que no la está usando dentro de una transacción. Es posible que puedas hacer algo lindo con la base 64, pero sería muy lento.

3

¿Ha intentado utilizar PreparedStatement en modo Lote?

PreparedStatement pStmt = ...; 
    while(...) { // use for or whatever loop 
     pStmt.clearParameters(); 
     pStmt.setBinaryStream(2, ...); 
     pStmt.addBatch(); 
    } 
    pStmt.executeBatch(); 

Para obtener información más detallada sobre cómo se puede hacer lotes eficiente con JDBC de MySQL y echar un vistazo aquí: MySQL and JDBC with rewriteBatchedStatements=true

+0

+1 para el modo por lotes. –

+0

Sí - Declaraciones de procesamiento por lotes 2000 a la vez. Intentando escribir algo más rápido que la importación estándar de mysql (con características personalizadas adicionales) El rendimiento actual es 40% más lento que la importación estándar, aunque estoy procesando en paralelo: las tablas con columnas binarias (que estoy procesando usando Los estados preparados son los más lentos) –

+0

@Ro. Entonces, PreparedStatement no es más lento que Stamement. Si es así, debe hacer una pregunta sobre por qué es así, porque no debería ser. –

Cuestiones relacionadas