运行Ubuntu14.04,安装了mysql-连接器-java-5.1.28。
让我们创建一个表:
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中跌跌撞撞,还是预期会出现这种行为?
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)发布于 2014-06-28 08:36:24
在我之前的响应中,我没有考虑到CONVERT TO行为,所以我尝试了您的测试,首先使用mysql本机客户端,所有的测试都很好,列被自动转换,然后使用jdbc连接器,实际上我得到了相同的错误.但经过一些测试和研究,我找到了解决办法。
您必须在jdbc连接url中添加参数jdbcCompliantTruncation并将其设置为false。
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是正确转换的(我只尝试使用一个空表):
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:
mysql> show variables like 'sql_mode';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| sql_mode | NO_ENGINE_SUBSTITUTION |
+---------------+------------------------+jdbcCompliantTruncation=false导致服务器和jdbc之间的行为对齐。
https://dba.stackexchange.com/questions/68964
复制相似问题