mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...

总结写在前面,

总结:

当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码,

  1. mysql服务器端,对数据表(不是数据库)的编码设置,要保证是支持中文的,例如gbk, gb2312, utf-8
  2. jdbc的连接配置,要开启useUnicode=true,并且要设置一个支持中文的编码,不需要跟mysql表的编码保持一致,只需要支持中文就行。例如characterEncoding=utf8
  3. 本身的Java文件的编码需要支持中文

=============================================================================

刚学习JDBC,今天在调试代码的时候发现明明在公司的时候还能正常执行的插入语句,回来就不行了,测试代码是这样的。

数据库配置文件 mysql.ini

1 driver=com.mysql.jdbc.Driver
2 url=jdbc:mysql://127.0.0.1:3306/dedecms
3 user=root
4 pass=

测试代码

 1 package db;
 2
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 import java.sql.Connection;
 7 import java.sql.DriverManager;
 8 import java.sql.SQLException;
 9 import java.sql.Statement;
10 import java.util.Properties;
11
12 public class Test {
13     private String driver;
14     private String url;
15     private String user;
16     private String pass;
17     public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
18         Properties prop = new Properties();
19         prop.load(new FileInputStream(paramFile));
20         driver = prop.getProperty("driver");
21         url = prop.getProperty("url");
22         user = prop.getProperty("user");
23         pass = prop.getProperty("pass");
24         Class.forName(driver);
25     }
26
27     public int insertData(String sql) throws SQLException {
28         try (
29                 Connection conn = DriverManager.getConnection(url, user, pass);
30                 Statement stmt = conn.createStatement()) {
31             return stmt.executeUpdate(sql);
32         }
33     }
34
35     public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
36         Test t = new Test();
37         t.initParam("mysql.ini");
38         t.insertData("insert into jdbc_test (jdbc_name, jdbc_desc) values (‘测试标题‘,‘测试内容‘);");
39         System.out.println("ok");
40     }
41
42 }

本来在公司还能执行的,拿回家新建了数据库,就不行了,报错如下,

 1 Exception in thread "main" com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect string value: ‘\xCE\xE4\xBA\xBA\xB5\xD8...‘ for column ‘jdbc_name‘ at row 1
 2     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3513)
 3     at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
 4     at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
 5     at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
 6     at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548)
 7     at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1605)
 8     at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1524)
 9     at db.ExecuteSQL.insertData(ExecuteSQL.java:47)
10     at db.ExecuteSQL.main(ExecuteSQL.java:119)

考虑到插入了中文,在网上搜索了mysql的jdbc的url配置方法

1 url=jdbc:mysql://127.0.0.1:3306/dedecms?useUnicode=true&characterEncoding=utf8

即需要开启useUnicode=true并设置一种字符集,但是发现设置之后还是会出现上面的错误,于是又尝试修改了Eclipse文档的字符集,

即在preferences->general->workspace->text file encoding下选择UTF-8,使java文件与jdbc链接配置的编码一致,

然而发现这么设置之后,已然会出现上面的问题,想想大概是mysql数据库本身的设置不对,于是又更改下面的配置(用的phpMyAdmin做mysql客户端)

找到我当前的数据库,将排序规则改为了 utf8_unicode_ci

再次执行程序,发现问题依然存在,于是又折腾了半天,发现不仅仅是数据库可以修改排序规则,单个表格也可以修改排序规则,

将表格的排序规则也改成 utf8_unicode_ci ,并且勾选 Change all column collations ,

再次执行程序,终于可以看到数据正常插入了!

程序测试结果,

表内容

不过后来又发现一个有趣的事情,就是无论mysql服务器的表设置为什么编码,只要在jdbc链接的时候也选择同样的编码,程序就可以执行成功,

只不过如果编码不支持中文的话,数据表里就会出现乱码,例如这样,

mysql数据表是拉丁编码

mysql链接字符串也用拉丁编码

1 url=jdbc:mysql://127.0.0.1:3306/dedecms?useUnicode=true&characterEncoding=latin1

java文件编码默认

然后发现可以执行,

但是数据表里全是乱码,

而一旦将数据表里的编码修改成支持中文的编码,比如gb2312

并且将mysql jdbc的链接也修改成支持中文的编码, gb2312, gbk, utf8中的任何一个都行,并不需要跟数据表编码一致,

1 url=jdbc:mysql://127.0.0.1:3306/dedecms?useUnicode=true&characterEncoding=utf8

当然,eclipse的文件编码也必须支持中文(否则根本无法保存含有中文的文件),比如utf-8

这样的话,就能正常执行程序,而且插入数据表的中文也不会乱码了

总结:

当Java通过jdbc链接mysql插入中文时,要保证程序可以正常执行,而且插入的中文不会乱码,

  1. mysql服务器端,对数据表的编码设置,要保证是支持中文的,例如gbk, gb2312, utf-8
  2. jdbc的连接配置,要开启useUnicode=true,并且要设置一个支持中文的编码,不需要跟mysql表的编码保持一致,只需要支持中文就行。例如characterEncoding=utf8
  3. 本身的Java文件的编码需要支持中文
时间: 2024-10-05 23:09:39

mysql 插入中文报错: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value...的相关文章

mysql插入中文报错的问题

报错:1366, "Incorrect string value: '\\xE6\\xB7\\xB1\\xE5\\x85\\xA5...' for column ' 由于公司原因之前一直在使用oracle,最近做一个es+springboot练习时使用到mysql发现在插入中文时不能正常成功; 解决办法: 在创建数据库时就将库中的编码格式设置好:default charset utf8 collate utf8_unicode_ci; create database bdname default

解决MySql插入中文报错的问题

Incorrect string value: '\xE6\x9B\xB9\xE5\x86\xAC...' for column 'realname' at row 1 该情况一般是由数据库设计时的编码错误导致的. show variables like 'character%' ;  查看数据库编码,为latin1. 如果项目正在测试当中,数据不重要的话,一劳永逸的解决办法是,使用 alert database tuanplus character set utf8 更改数据库的编码格式,再重

ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - Data truncation: Incorrect datetime value: '' for column 'pubdate' at row 1

之前的Connector/J版本是:mysql-connector-java-5.0.4-bin.jar 后来换成mysql-connector-java-5.1.45-bin.jar,问题解决 2018-02-16 01:07:10,086 WARN [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] - SQL Error: 0, SQLState: 220012018-02-16 01:07:10,086 ERROR [org.hibern

客户端cmd打开mysql,执行插入中文报错或插入中文乱码解决方案

最近在制作一个安装包,需要安装的时候执行mysql脚本儿,做了一个批处理,但是发现总是执行到 插入中文的时候报错,或者插入中文是乱码. 网上查了好多资料,说是把编码改成GBK什么的,终究还是不成功. 最后经过多次测试,现把解决方案分享给大家. 第一步:打开mysql中的配置文件,my.ini,看一看配置文件中 [mysql] default-character-set=utf8 [mysqld] character-set-server=utf8 看是不是这样配置的.因为utf8 是国际通用的,

MySql 插入数据库报错 Incorrect string value: '\xF0\xA0\x86\xA2'

今天从nginx日志分析搜索关键字,然后把关键字插入到Mysql数据库里,出现如下错误 SQL state [HY000]; error code [1366]; Incorrect string value: '\xF0\xA0\x86\xA2' for column 'XXXX' at row 38; nested exception is java.sql.SQLException: Incorrect string value: '\xF0\xA0\x86\xA2' for column

mysql插入数据 报错[Err] 1136 - Column count doesn't match value count at row 1(表中有自增列)

版本:8.0.16 创建了一张表:create table user_table(uid int primary key auto_increment,uname varchar(10))auto_increment=1 插入数据报错: 经查找 ,有三种方式可以解决这个问题: 1.插入数据得时候,带入列名: insert into user_table("uname") values ("刘一") 2.自增键这列设置为0 insert into user_table

Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect date value

Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Incorrect date value: '1541123218569' for column 'create_time' at row 1 遇到这种问题的原因有两种 1.可能是表中设置的字符集与你想要插入的字符集不相同. 解决方法: (1)修改数据库默认编码ALTER DATABASE `test` DEFAULT CHARACTER SET u

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'content' a

1.错误描述 org.hibernate.exception.DataException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:69) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert

Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value: 'L

1.错误描述 [ERROR:]2015-06-08 09:49:42,523 [异常拦截] org.hibernate.exception.DataException: error executing work at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:69) at org.hibernate.exception.internal.Stand