总结写在前面,

总结:

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

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

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

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

数据库配置文件 mysql.ini

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

测试代码

 package db;

 import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties; public class Test {
private String driver;
private String url;
private String user;
private String pass;
public void initParam(String paramFile) throws FileNotFoundException, IOException, ClassNotFoundException {
Properties prop = new Properties();
prop.load(new FileInputStream(paramFile));
driver = prop.getProperty("driver");
url = prop.getProperty("url");
user = prop.getProperty("user");
pass = prop.getProperty("pass");
Class.forName(driver);
} public int insertData(String sql) throws SQLException {
try (
Connection conn = DriverManager.getConnection(url, user, pass);
Statement stmt = conn.createStatement()) {
return stmt.executeUpdate(sql);
}
} public static void main(String[] args) throws FileNotFoundException, ClassNotFoundException, IOException, SQLException {
Test t = new Test();
t.initParam("mysql.ini");
t.insertData("insert into jdbc_test (jdbc_name, jdbc_desc) values ('测试标题','测试内容');");
System.out.println("ok");
} }

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

 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
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3513)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3447)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1951)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2101)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2548)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1605)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1524)
at db.ExecuteSQL.insertData(ExecuteSQL.java:47)
at db.ExecuteSQL.main(ExecuteSQL.java:119)

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

 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链接字符串也用拉丁编码

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

java文件编码默认

然后发现可以执行,

但是数据表里全是乱码,

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

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

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

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

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

所以,在创建表的时候顺便指定字符集是很重要的,像这样,

 create table jdbc_test (jdbc_id int auto_increment primary key,  jdbc_name varchar(255), jdbc_desc text) DEFAULT CHARSET=utf8;

总结:

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

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

ps:

关于这个问题,今天在CSDN上看到一个喜欢钻研的人,研究了一下jdbc数据传输过程(tcp),并做了抓包分析,颇有帮助,

http://blog.csdn.net/dslztx/article/details/47070475

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

  1. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value: '' for column 'createtime' at row 1...

    之前项目一直好好的,之后电脑重装系统,数据库重新安装了一个5.6版本的,项目jar包丢失了,之后就又重新找了一些jar包倒入,结果运行报错: Caused by: com.mysql.jdbc.Mys ...

  2. Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect datetime value:

    问题:ERROR JDBCExceptionReporter:72 - Data truncation: Incorrect datetime value: '' for column 'create ...

  3. mysql插入中文报错的问题

    报错:1366, "Incorrect string value: '\\xE6\\xB7\\xB1\\xE5\\x85\\xA5...' for column ' 由于公司原因之前一直在使 ...

  4. 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,问题解决 20 ...

  5. 数据库报错com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'ua' at row 1

    记一次报错记录,成长路上的点滴 明明使用浏览器或者微信开发工具调试接口没有问题,但是在真机测试时候就出问题了.(((¬_¬)) 500服务器内部错误,要死的节奏啊 登陆tomcat服务器 使用命令ta ...

  6. Mysql插入text类型字段错误记录 com.mysql.jdbc.MysqlDataTruncation: Data truncation: #22001

    一次插入操作报如下错误 com.mysql.jdbc.MysqlDataTruncation: Data truncation: #22001 是说字段值长度超过限制. MySQL TEXT数据类型的 ...

  7. com.mysql.jdbc.MysqlDataTruncation:Data Truncation:Data too long for column '字段name' at row 1

    1.问题描述: 在mysql插入数据的时候报错:Cause: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long fo ...

  8. com.mysql.jdbc.MysqlDataTruncation: Data truncation: Truncated incorrect DOUBLE value:...

    在使用mybatis的@Update注解的时候,报了一个这样的错 ### Error updating database. Cause: com.mysql.jdbc.MysqlDataTruncat ...

  9. 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 ...

随机推荐

  1. sql 数据库 初级 个人学习总结(一)

    数据库个人总结(初级)1.增删改查 insert into 表名 values ('条件','条件2') delete from 表名 where 条件 update 表名 set=条件值 where ...

  2. Android课程---Android Studio简单设置

    Android Studio 简单设置 界面设置 默认的 Android Studio 为灰色界面,可以选择使用炫酷的黑色界面.Settings-->Appearance-->Theme, ...

  3. Android课程---Android Studio安装及使用

    2013年Google I/O 大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA 开发环境,旨在取代Eclipse和ADT(And ...

  4. EL表达式与JSTL

    内容包括 EL表达式 EL函数库 JSTL 核心标签库 格式化标签库 SQL标签库 XML标签库 自定义标签库 EL表达式 EL是Expression Language的是缩写,是JSP页面编写的一种 ...

  5. 算法与数据结构题目的 PHP 实现:栈和队列 由两个栈组成的队列

    思路:同样使用 PHP 的数组模拟栈.栈的特点是先进后出,队列的特点是先进先出,可以用第一个栈(StackPush)作为压入栈,压入数据的时候只往这个栈中压入数据,第二个栈作(StackPop)为弹出 ...

  6. Git的常用操作

    $ git log //查看commit记录 $ git add <file> //添加文件到commit中 .代表所有改动的文件 $ git commit -m 'meesage' // ...

  7. Swift声明参考

    一条声明可以在你的程序里引入新的名字和构造.举例来说,你可以使用声明来引入函数和方法,变量和常量,或者来定义 新的命名好的枚举,结构,类和协议类型.你也可以使用一条声明来延长一个已经存在的命名好的类型 ...

  8. 使用apache.lang包安全简洁地操作Java时间

    引言 最近偶遇apache开发的工作java工具包,一使用,就发现自己爱上它了.不多说了,下面介绍org.apache.commons.lang3.time包中处理java程序员为之头疼的时间的类. ...

  9. Nodejs开发(1.Sublime Text 3配置)

    本例使用Sublime Text 3开发 原因: 1. 有开发提示: 2. 非常easy的调试运行: 下载Sublime Text 3,官网地址:http://www.sublimetext.com/ ...

  10. join用法

    join命令可以将多个文件结合在一起,每个文件里的每条记录,都共享一个键值(key),键值指的是记录中的主字段,通常会是用户名称.个人姓氏.员工编号之类的数据. join - join lines o ...