2012-10-24 4 views
4

우리는 아무런 문제없이 1 개월이 지난 후 이동 경로를 사용하고 있습니다.이동 경로 MySQL 구문 오류

하지만 오늘 (1500 라인 이상) 매우 길며 이상한 MySQL 구문 오류가 발생한 새로운 마이그레이션 스크립트를 추가하려고했습니다.

이 스크립트를 MySQL Workbench에서 열었습니다.보고 된 곳에서는 오류없이 스크립트가 실행됩니다. 오류없이 실행됩니다.

'V10012__insert-acceptance-testing-event-moment-passed.sql'이라는 스크립트에는 다음 지침이 포함되어 있습니다. 마지막

  • INSERT 문 1
  • INSERT 문이
  • ...
  • INSERT 문 - 1
  • INSERT 문 MySQL이보고 LAST

오류 다음과 같습니다 :

[ERROR] com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException에 의해 발생 : 당신은 당신의 SQL 구문에 오류가;MySQL 서버 버전에 해당하는 매뉴얼에서 올바른 구문을 찾으려면 'INSERT INTO video_feedback (id, youtube_video_id) VALUES (1102,/* id * /' 줄 232 [ERROR] com.googlecode 근처에서 사용하십시오. flyway.core.migration.MigrationException :!. 실패 버전 10012로 마이그레이션 백업을 복원하고 데이터베이스 코드를 롤백하십시오

오류는 'INSERT 문 LAST'문에보고를

을하지만, 내 스크립트에서 'INSERT 문 LAST'및 'INSERT 문 LAST - 1'을 반전하면 rror은 'INSERT 문 LAST - 1'(파일의 끝 부분에 있음)에보고됩니다. Flyway가 성공적으로 실행했기 때문에 'INSERT 문 마지막에'오류가 없습니다.

또한, 지금은 완전히 스크립트 'V10012_ 삽입 수락 테스트 이벤트 - 순간 passed.sql'에서 'INSERT의 마지막 문'문을 제거하고라는 새 파일 'V10013에이 문을 넣을 경우 _test.sql 'flyway가 모든 이주 스크립트를 성공적으로 실행합니다!

그래서 'V10012__insert-acceptance-testing-event-moment.sql'스크립트의 문제점은 무엇입니까?

가능한 스크립트 크기 제한이 있습니까?

  • 내 스크립트/* */주석
  • 이동 경로 메이븐 플러그인 1.7
  • 메이븐 2.0을 많이 사용합니다 여기

    는 유용 내 환경에 대한 정보입니다.3

  • MySQL은 : MySQL의 커넥터 - 자바 : 5.1.21
  • 의 MySQL 5.5.X
  • 자바 JDK 1.7.0_09-B05
  • 윈도우 7

답변

2

는 드디어 이유를 발견 문제의 내 스크립트에서

내가했다 : 나는 테마 내 모든 이주 스크립트를 실행하는 데 성공 이동 경로 삭제하면

... 
... 

/* INSERT statement LAST - 1 */ 
INSERT INTO `table_1` (`id`, `string_1`, `string_2`) 
VALUES (
    1, 
    'aaa', /* COMMENT 1*/ 
    'bbb' /* COMMENT 2*/ 
); 

/* INSERT statement LAST */ 
INSERT INTO `table_2` (`id`, `string_3`) 
VALUES (
    1,  /* COMMENT 3 */ 
    'cccc' /* COMMENT 4 */ 
); 

문제점은 COMMENT 2 COMMENT 4. 것으로 보인다.

예를 들어이 스크립트가 작동합니다 :

... 
... 

/* INSERT statement LAST - 1 */ 
INSERT INTO `table_1` (`id`, `string_1`, `string_2`) 
VALUES (
    1, 
    'aaa', /* COMMENT 1*/ 
    'bbb'  
); 

/* INSERT statement LAST */ 
INSERT INTO `table_2` (`id`, `string_3`) 
VALUES (
    1, /* COMMENT 3 */ 
    'cccc' 
); 

그래서, 아마도이 이동 경로 파서 내부의 버그가?

오늘 테스트 할 시간이 없어하지만 경우에만이 오류가 발생 나타납니다 : 우리는 (또는 다른 문자열 열 유형 내 생각)

  • 이이 포함 된 VARCHAR 후 주석이

    • 주석은 ')'문자 바로 앞에 위치합니다.

    하나의 SQL 스크립트에 여러 삽입 문이있는 경우에만 이러한 문제가 재현 될 수 있습니다.

    게다가, ')'는 앞에 배치되지 않은 코멘트처럼 올바른지 가정 : 그들은 위치 때문에 철새 이동 경로에

    다음
    /* INSERT statement LAST */ 
    INSERT INTO `table_2` (`id`, `string_3`) 
    VALUES (
        1, /* COMMENT 3 */ 
        'cccc', /* COMMENT 4 */ 
        'dddd' 
    ); 
    

    주석 3 COMMENT 4 패스 후 ',' 문자열 값 앞에 있지만 ')'문자 앞에 배치되지 않습니다. 이 ;-)

  • +0

    비슷한 문제가 있습니다. 의견에 따옴표가 없습니까? – Tonin

    0

    도움이 될 수 있습니다

    희망이 이동 경로로 인해 매우 낮다. 이것은 거의 플라이 웨이가 사용하고있는 MySQL 드라이버와 관련이 있습니다. MySql 네이티브 클라이언트를 사용하면 자연스럽게 모든 합법적 인 구문을 처리 할 수 ​​있다고 가정합니다. 심지어 '선택적'주석 블록

    에 대해 알고있는 한 가지 문제 MySql 용 jdbc 드라이버에서이 확실한 구분 기호 스와핑을 처리 할 수 ​​없다는 것입니다. 따라서 트리거 및 저장 프로 시저가 특히 mysqldump을 사용하여 생성되었지만 Java 응용 프로그램을 사용하여 가져 오는 경우 문제가 될 수 있습니다.

    here으로 가서 spring.datasource.separator으로 가면 시스템 전체가 (기본적으로) ;으로 표시됩니다.이제

    은 스크립트에서이 라인에 올 때이 동작하는 방법을 상상 :

    DELIMITER ;; 
    CREATE FUNCTION `int2vancode`(id BIGINT(20)) RETURNS varchar(255) 
    BEGIN 
        DECLARE num VARCHAR(10); 
        DECLARE length INT; 
        SET num = conv(id, 10, 36); 
        SET length = char_length(num); 
    
        return CONCAT(conv(length -1 , 10, 36), num); 
    END ;; 
    DELIMITER ; 
    

    자바 드라이버가 바보이고 DELIMITER 문이 명확하게 의미 경우에도 그 문장의 해석하지 않습니다 클라이언트

    네이티브 클라이언트가 문제없이 모든 스크립트를 실행하지만 flyway가 intellij에서도 볼 수없는 구문 오류가 발생하는 문제가 발생했습니다.

    ** 업데이트 **

    내 문제를 해결

    하고 더 또는 덜 내가보고하고 문제 확인 : 내가 만들 테이블을했다 :

    CREATE TABLE `Position` (
        PositionID INT NOT NULL AUTO_INCREMENT, 
        `Name` varchar(200) COLLATE utf8_unicode_ci NOT NULL 
    ); 
    

    을 내가 Name을 탈출했다가 반복적으로 이들을 실행하는 mybash 스크립트가 아무런 문제가 없더라도 flyway가 그것을 받아 들일 수 있도록 Position을 사용하십시오.

    Java 드라이버에게 도움이 될만한 정보가 있습니까?