Flyway MySQL语法错误

Flyway MySQL语法错误,mysql,jdbc,flyway,Mysql,Jdbc,Flyway,我们从一个月开始使用Flyway,没有遇到任何问题 但是,今天我尝试添加一个新的迁移脚本,它非常长(超过1500行),并且遇到了一个奇怪的MySQL语法错误 我在MySQL Workbench中打开了这个脚本,没有报告语法错误,脚本执行时没有错误 此名为“V10012_uuinsert-acceptance-testing-event-moment-passed.sql”的脚本包含以下说明 插入语句1 插入语句2 INSERT语句LAST-1 最后插入语句 MySQL报告的错误如下: [错

我们从一个月开始使用Flyway,没有遇到任何问题

但是,今天我尝试添加一个新的迁移脚本,它非常长(超过1500行),并且遇到了一个奇怪的MySQL语法错误

我在MySQL Workbench中打开了这个脚本,没有报告语法错误,脚本执行时没有错误

此名为“V10012_uuinsert-acceptance-testing-event-moment-passed.sql”的脚本包含以下说明

  • 插入语句1
  • 插入语句2
  • INSERT语句LAST-1
  • 最后插入语句
MySQL报告的错误如下:

[错误]由以下原因引起 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您有一个 SQL语法错误;检查与您的产品相对应的手册 MySQL服务器版本,以便在“插入到”中使用正确的语法 视频反馈(id,youtube视频id)值(1102,/*id*/' 在第232行[错误] com.googlecode.flyway.core.migration.MigrationException:迁移到 版本10012失败!请还原备份并回滚数据库 还有密码

“INSERT statement LAST”语句中报告了错误

但是,如果在脚本中反转“INSERT statement LAST”和“INSERT statement LAST-1”,则“INSERT statement LAST-1”(现在位于文件末尾)上会报告错误。因此,“INSERT statement LAST”中没有错误,因为Flyway成功执行了它

另外,如果现在我从脚本“V10012_INSERT-acceptance-testing-event-moment-passed.sql”中完全删除“INSERT statement LAST”语句,并将该语句放入名为“V10013_test.sql”的新文件中,flyway将成功执行我的所有迁移脚本

那么,我最初的“V10012\uuu insert-acceptance-testing-event-moment-passed.sql”脚本中会出现什么问题

是否存在可能的脚本大小限制

以下是有关我的环境的有用信息:

  • 我的脚本使用了大量的/**/注释
  • Flyway Maven插件1.7
  • Maven 2.0.3
  • mysql:mysql连接器java:5.1.21
  • MySQL 5.5.X
  • Java JDK 1.7.0_09-b05
  • 视窗7

我终于找到了问题的原因

在我的剧本中,我有:

... 
...

/* 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    */
);
问题似乎出现在注释2和注释4上。如果我删除主题,flyway将成功执行所有迁移脚本

例如,此脚本将工作:

... 
...

/* 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'   
);
那么,这可能是Flyway解析器中的一个bug

我今天没有时间测试它,但似乎只有在以下情况下才会出现此错误:

  • 我们在VARCHAR(或者我想是其他字符串-列类型)后面有一个注释
  • 此注释位于“')字符前面
只有在一个SQL脚本中存在多个insert语句时,此问题才可能重现

此外,我认为不放在“')”前面的注释是正确的,例如:

/* INSERT statement LAST */
INSERT INTO `table_2` (`id`, `string_3`)
VALUES (
    1,   /* COMMENT 3   */
    'cccc',  /* COMMENT 4   */
    'dddd'
);
此处注释3和注释4以Flyway方式传递,因为它们位于“,”之后和字符串值之前,但不位于“')”字符之前


希望这能有所帮助;-)

这是不太可能的,因为有飞行路线。这几乎肯定与flyway使用的MySQL驱动程序有关。使用MySql本地客户端,您自然会假设它可以处理任何法律语法。即使是“可选”注释块

我在MySql的jdbc驱动程序中肯定知道的一个问题是,它不能处理动态分隔符交换。因此,触发器和存储过程可能是一个问题,特别是如果它们是使用
mysqldump
生成的,但随后您使用Java应用程序重新摄取

如果您查看并转到
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 ;
java驱动程序是哑的,并且不会解释这些语句中的任何一条,即使
分隔符
语句显然是针对客户机的

我现在遇到了一个问题,本地客户端执行每个脚本都没有问题,但是flyway说我有一个语法错误,连intellij都看不到

**更新**

我解决了我的问题,这或多或少证实了我所看到的问题: 我有一个创建表:

CREATE TABLE `Position` (
  PositionID INT NOT NULL AUTO_INCREMENT,
  `Name` varchar(200) COLLATE utf8_unicode_ci NOT NULL
);
我必须退出
Name
Position
,才能让flyway接受它,即使我迭代执行这些命令的bash脚本没有问题


也许我可以告诉Java驱动程序一些帮助它的方法?

我也遇到了类似的问题。你的评论里没有引用任何话吗?