【问题标题】:Liquibase MySQL: syntax error near '????????????????'Liquibase MySQL:'????????????????'附近的语法错误
【发布时间】:2012-06-05 01:49:11
【问题描述】:

我正在尝试使用以下参数(默认参数,只是修改路径)运行 liquibase:

liquibase --driver=com.mysql.jdbc.Driver \
     --classpath=mysql-connector-java-5.1.20-bin.jar
     --changeLogFile=changelog.xml \
     --url="jdbc:mysql://localhost/example" \
     --username=root \
     migrate

changelog.xml 非常小:

 <?xml version="1.0" encoding="UTF-8"?>   <databaseChangeLog  
 xmlns="http://www.liquibase.org/xml/ns/dbchangelog"  
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
 xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
          http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">  
 </databaseChangeLog>

我得到的错误是:

Liquibase 更新失败:您的 SQL 语法有错误;查看 与您的 MySQL 服务器版本相对应的手册 '????????????????' 附近使用的语法在第 1 行严重 2012 年 6 月 5 日 2:42 a.m.:liquibase:您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本以获得正确的语法 在'????????????????'附近使用在第 1 行 liquibase.exception.DatabaseException: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:你有一个错误 在您的 SQL 语法中;检查与您的 MySQL 对应的手册 在 '????????????????' 附近使用正确语法的服务器版本在 第 1 行 liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:111) 在 liquibase.integration.commandline.Main.doMigration(Main.java:745)
在 liquibase.integration.commandline.Main.main(Main.java:134) 引起 作者:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:你有一个 SQL 语法错误;检查与您对应的手册 MySQL 服务器版本,以便在附近使用正确的语法 '??????????????????在第 1 行 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1049) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651) 在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677) 在 com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1943) 在 com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3541) 在 com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2443) 在 com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2213) 在 com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:797) 在 com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:385)
在 com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) 在 liquibase.integration.commandline.CommandLineUtils.createDatabaseObject(CommandLineUtils.java:101) ...2 更多

不知道是什么原因造成的。我正在运行 liquibase 2.0.5。

谢谢。

【问题讨论】:

    标签: mysql liquibase


    【解决方案1】:

    我有一个非常相似的问题,'????????????????让我怀疑是字符集问题。追加:

     ?useJvmCharsetConverters=true

    到 liquibase.properties 中的 url 字符串,如 this post 中所建议的,为我修复了它。

    我建议你尝试替换:

     --url="jdbc:mysql://localhost/example"

    作者:

     --url="jdbc:mysql://localhost/example?useJvmCharsetConverters=true"

    在你的 liquibase 命令行中。

    希望这会有所帮助。

    【讨论】:

    • 发生问题的服务器不再运行,所以我不知道它是否会修复它,但无论如何感谢!也许将来会帮助其他人:)
    【解决方案2】:

    我怀疑 MySQL 服务器的版本与您使用的 JDBC 客户端 jar 不匹配。 5.1 版本已经很老了,MySQL 的最新版本是 5.6

    要对此进行调查,您可以使用 liquibase 生成 SQL 文件,并尝试使用 mysql 之类的工具对您的数据库运行此文件。

    liquibase --driver=com.mysql.jdbc.Driver \
         --classpath=mysql-connector-java-5.1.20-bin.jar
         --changeLogFile=changelog.xml \
         --url="jdbc:mysql://localhost/example" \
         --username=root \
         updateSQL
    

    更新

    我使用调试运行了我的示例,如下所示:

    java -jar liquibase.jar --logLevel=debug --logFile=update.log updateSQL
    

    按如下方式生成日志文件:

    DEBUG 13/06/12 19:08:liquibase: Unable to load/access Apache Derby driver class to check version
    DEBUG 13/06/12 19:08:liquibase: Connected to liquibase@localhost@jdbc:mysql://localhost:3306/liquibase
    INFO 13/06/12 19:08:liquibase: Successfully acquired change log lock
    DEBUG 13/06/12 19:08:liquibase: Executing QUERY database command: SELECT MD5SUM FROM `DATABASECHANGELOG` WHERE MD5SUM IS NOT NULL
    INFO 13/06/12 19:08:liquibase: Reading from `DATABASECHANGELOG`
    DEBUG 13/06/12 19:08:liquibase: Executing QUERY database command: SELECT FILENAME,AUTHOR,ID,MD5SUM,DATEEXECUTED,ORDEREXECUTED,TAG,EXECTYPE FROM `DATABASECHANGELOG` ORDER BY DATEEXECUTED ASC, ORDEREXECUTED ASC
    ..
    ..
    

    复制了相同的 Apache Derby 消息(在我看来,这就像默认的数据库检查)。

    重要的一点是MySQL连接消息是否出现在你的日志文件中?

    如您所见,Liquibase 然后针对其 DATABASECHANGELOG 表执行 SQL 语句以确定 DB 模式的状态。

    【讨论】:

    • 但是 5.1.20 是 J Connector 的最新版本。该服务器正在运行 MySQL 5.5.20,根据 Docs,5.1.X 连接器支持该版本。
    • @Gediminas 生成的 SQL 是什么样的?我试图重现您的错误但失败了。
    • 我真的很抱歉这么慢的反应。这是相同的错误(检查与您的 MySQL 服务器版本相对应的手册,以获取在第 1 行的“????????????????”附近使用的正确语法)。我还尝试将日志级别设置为调试,再添加一行:DEBUG 6/13/12 1:08 a.m.:liquibase: Unable to load/access Apache Derby driver class to check version 虽然不显示任何查询。
    • @Gediminas Apache Derby?但是您的 JDBC URL 正在尝试连接到 MySQL?很奇怪。
    • 不,MySQL 消息不会出现。只有第一个,德比。尽管如果我将用户名更改为一些无效的、不存在的或对数据库名称执行相同操作,它会打印 MySQL 错误,即无法找到指定的数据库或拒绝用户访问。 java --version 输出为:java version "1.5.0" gij (GNU libgcj) version 4.4.6 20110731 (Red Hat 4.4.6-3) 服务器运行 64 位 CentOS 6.2,内核版本为 2.6.32-042stab055.12
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2013-06-22
    • 2017-08-31
    • 2023-03-03
    • 2016-02-16
    • 2018-08-21
    • 2017-01-12
    相关资源
    最近更新 更多