首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQLSyntaxErrorException在ALTER上..。转换成..。在MySQL连接器/J

MySQLSyntaxErrorException在ALTER上..。转换成..。在MySQL连接器/J
EN

Database Administration用户
提问于 2014-06-24 22:01:18
回答 1查看 519关注 0票数 1

运行Ubuntu14.04,安装了mysql-连接器-java-5.1.28。

让我们创建一个表:

代码语言:javascript
复制
CREATE TABLE mytable (value1 VARCHAR(32000), value2 TEXT, value3 VARCHAR(1000), value4 VARCHAR(32000)) CHARACTER SET latin1 COLLATE latin1_swedish_ci;

通过Statement.execute()执行以下ALTER语句失败,说明“列长度太大.*”。

但是,根据文档,换桌子...转换成...应该执行必要的自动类型转换,以确保新列的长度足以存储与原始列一样多的字符。该语句确实在执行必要转换的本机MySQL客户机中运行。

我是在JDBC中跌跌撞撞,还是预期会出现这种行为?

代码语言:javascript
复制
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Column length too big for column 'value1' (max = 21845); use BLOB or TEXT instead
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4237)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4169)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2617)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2778)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2819)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2768)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:949)
    at com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:795)
    at Main.main(Main.java:32)
EN

回答 1

Database Administration用户

回答已采纳

发布于 2014-06-28 08:36:24

在我之前的响应中,我没有考虑到CONVERT TO行为,所以我尝试了您的测试,首先使用mysql本机客户端,所有的测试都很好,列被自动转换,然后使用jdbc连接器,实际上我得到了相同的错误.但经过一些测试和研究,我找到了解决办法。

您必须在jdbc连接url中添加参数jdbcCompliantTruncation并将其设置为false

代码语言:javascript
复制
jdbc:mysql://localhost/test?jdbcCompliantTruncation=false

当数据被截断时,驱动程序是否应该抛出java.sql.DataTruncation异常,就像JDBC规范在连接到支持警告的服务器(MySQL 4.1.0和更新版本)时所需要的那样?如果服务器sql-模式包括STRICT_TRANS_TABLES,则此属性无效。默认值: true

来源:5.1连接器/J的驱动程序/数据源类名、URL语法和配置属性

使用上面的连接url运行我的java代码表mytable是正确转换的(我只尝试使用一个空表):

代码语言:javascript
复制
mysql> desc mytable;
+--------+---------------+------+-----+---------+-------+
| Field  | Type          | Null | Key | Default | Extra |
+--------+---------------+------+-----+---------+-------+
| value1 | mediumtext    | YES  |     | NULL    |       |
| value2 | mediumtext    | YES  |     | NULL    |       |
| value3 | varchar(1000) | YES  |     | NULL    |       |
| value4 | mediumtext    | YES  |     | NULL    |       |
+--------+---------------+------+-----+---------+-------+

因此,如果服务器在没有STRICT_TRANS_TABLES的情况下在sql_mode中运行,则ex:

代码语言:javascript
复制
mysql> show variables like 'sql_mode';
+---------------+------------------------+
| Variable_name | Value                  |
+---------------+------------------------+
| sql_mode      | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+

jdbcCompliantTruncation=false导致服务器和jdbc之间的行为对齐。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/68964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档