2012-04-13 2 views
5

미리 준비된 문장을 사용하지 않고 MySQL 데이터베이스에 바이너리 데이터를 삽입하려고합니다. 그 이유는 수천 개의 문장을 한 번에 하나의 문장으로 결합하기 때문입니다. 나는 다음과 같은 문장을 시도MySQL에 바이너리 데이터 삽입하기 (PreparedStatement없이)

(정확히 MySQL이 & 수입 작품을 덤프하는 방법),하지만 모두 실패 : MY_TABLE 값으로

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

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

INSERT INTO my_table VALUE (1, CONVERT ('g = F | ) X ', BINARY), 2); MY_TABLE 값으로

INSERT (1, BINARY 'g = F |} X'는 2)

내가 오류는 다음과 같습니다

com.mysql.jdbc.MysqlDataTruncation : 데이터 잘림 : 데이터가 너무 긴 행 1

에서 열 'binary_data'내가이 문을 실행하는 데 사용하는 코드는 간단하다 :

conn.createStatement(). executeUpdate (sql);

자는 PreparedStatements는 잘 작동 (그러나이 경우 너무 느리다)

데이터베이스의 실제 문자열 내가 조금 differet 표시

그램 = ÷의 | ¸} X의 £의 난 [

이진 전망 : 67 F7 3D 81 19 46 F3 7C B8의 7D 58 8C 10 A3 EC 5B

자바 바이트 : 103, 61, -127, -13, 25, -13, 70, 124, -72, 125, 88, -116, 16, -93, -20, 91

인코딩과 관련이 있습니까?

어떤 힌트가 많이 apprecaited, 롬

+3

바이너리 데이터를 삽입 할 수 있습니다 :

직접 예를 들어 0X

에 의해 HEX로 변환을 덧붙일 바이트를 작성하여 바이너리 데이터를 삽입 할 수 있습니다 가능한 'Statement'를 사용하면 가능합니다. –

+2

당신이 한 "최적화"는 아마도 가치가 없다는 것을 알고 있습니까? 준비된 문장의 요점은 그것들이 MySQL에 의해 "프리 컴파일"되어 MySQL에 매개 변수를 제공한다는 것입니다. 명령문을 연결하든 그렇지 않든 관계없이 어쨌든 수천 개의 값을 보냅니다. 그리고 당연히 바이너리 데이터를 쉽게 삽입 할 수 없기 때문에 이것은 문제가되었습니다. –

+0

어떻게'INSERT' 문을 생성하고 있습니까? 인코딩은 문제가 될 수 있지만 올바른 이스케이프 (예 : 바이너리 데이터에'''가있는 경우)에 대해 걱정해야합니다. 또한 당신의 JDBC [connection parameters] (http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-configuration-properties.html)에서'useUnicode'와'characterEncoding '? –

답변

11

.... : 당신이 JDBC와 MySQL과 함께 일괄 처리가 효율적으로 만들 수있는 방법에 대한 자세한 내용

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

여기 봐 .단지 PreparedStatement` 또는`CallableStatement`가 아닌`를 통해

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

mysql이 16 진수를 자동으로 해독한다는 것을 깨닫지 못했습니다.이 유용한 게시물 덕분입니다. – fabspro

+1

표기법 x'19c0300dc90e7cedf64703ed8ae8683b '도 작동합니다. 이것은 모두 MySQL 레퍼런스 매뉴얼 §9.1.4에 문서화되어 있습니다. – olefevre

2

준비된 문은 의심 할 여지없이 가장 빠른 방법입니다. 너무 느린 이유는 트랜잭션 내에서 사용하지 않기 때문일 수 있습니다. 당신은베이스 64로 귀여운 것을 할 수도 있지만 매우 느릴 것입니다.

3

일괄 처리 모드에서 PreparedStatement를 사용해 보았습니까? 난 아무데도 문서화 톱하지 뭔가 있지만 .... 해결책을 찾을 수 MySQL and JDBC with rewriteBatchedStatements=true

+0

일괄 처리 모드의 경우 +1입니다. –

+0

예 - 이미 한 번에 2000 개의 문을 일괄 처리합니다. 표준 mysql 가져 오기 (추가 사용자 지정 기능 사용)보다 빠른 것을 작성하려고 시도합니다. 병렬 처리를하고 있어도 현재 성능이 표준 가져 오기보다 40 % 느리다 - 이진 열이있는 테이블 PreparedStatements가 가장 느림) –

+0

@Ro. 따라서 PreparedStatement는 Stamement보다 느리지 않습니다. 그렇다면 왜 그런지에 대한 질문을해야합니다. –

관련 문제