Liquibase MySQL:语法错误附近'????????????????

时间:2012-06-05 01:49:12

标签: mysql liquibase

我正在尝试使用以下参数运行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行严重6/5/12 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)引起   by:com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:你有一个   SQL语法错误;查看与您的手册相对应的手册   MySQL服务器版本为正确的语法使用附近   '????????????????'在第1行   com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1049)at at   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4096)at at   com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4028)at at   com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2490)at at   com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)at at   com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2677)at   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)at   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。

感谢。

2 个答案:

答案 0 :(得分:2)

我遇到了一个非常类似的问题,并且'????????????????让我怀疑是一个charset问题。追加:

  ?useJvmCharsetConverters=true

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

我建议你尝试更换:

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

由:

  --url="jdbc:mysql://localhost/example?useJvmCharsetConverters=true"
在你的liquibase命令行中

希望这有帮助。

答案 1 :(得分:0)

我怀疑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

更新

我使用debug运行我的示例如下:

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语句,以确定数据库模式的状态。