一、问题引出
在安装mysql是将其编码格式配置为utf-8,所以此时mysql的 character_set_client, character_set_connection, character_set_database, character_set_results, character_set_server, character_set_system编码格式都是utf-8。
查看编码格式的命令如下:
mysql> show variables like ‘character%‘;
当前mysql编码格式:
| character_set_client | utf8
|
| character_set_connection | utf8
|
| character_set_database | utf8
|
| character_set_filesystem | binary
|
| character_set_results | utf8
|
| character_set_server | utf8
|
| character_set_system | utf8
|
| character_sets_dir | D:\Program Files (x86)\MySQL\MySQL Server 5.5\share
\charsets\ |
那么问题来了,在代码中以utf-8的格式将带有中文字符的数据记录插入到数据库中之后,再通过cmd命令行查询数据,发现中文字段显示乱码,这是为什么呢?数据库编码格式为utf8,表和字段也都是utf8,存进去的格式是utf-8。
插入数据的代码
@Test public void testBatch02() { Connection conn = null; PreparedStatement ps = null; try { Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "root"); ps = conn.prepareStatement("insert into t_user(name, birth) values(?, ?)"); conn.setAutoCommit(false); long start = System.currentTimeMillis(); for (int i=0; i<10; i++) { ps.setString(1, "张三" + i); ps.setDate(2, new java.sql.Date(new Date().getTime())); ps.addBatch(); //ps.addBatch(sql); //这个方法是PreparedStatement接口从Statement接口中继承而来的。 } ps.executeBatch(); conn.commit(); long end = System.currentTimeMillis(); System.out.println("20000条记录批量插入耗时: " + (end-start) + "毫秒."); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (ps != null && !ps.isClosed()) { ps.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null && !conn.isClosed()) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
mysql> select * from t_user;
+----+----------+---------------------+
| id | name | birth |
+----+----------+---------------------+
| 1 | 寮犱笁0 | 2015-05-03 00:00:00 |
| 2 | 寮犱笁1 | 2015-05-03 00:00:00 |
| 3 | 寮犱笁2 | 2015-05-03 00:00:00 |
| 4 | 寮犱笁3 | 2015-05-03 00:00:00 |
| 5 | 寮犱笁4 | 2015-05-03 00:00:00 |
| 6 | 寮犱笁5 | 2015-05-03 00:00:00 |
| 7 | 寮犱笁6 | 2015-05-03 00:00:00 |
| 8 | 寮犱笁7 | 2015-05-03 00:00:00 |
| 9 | 寮犱笁8 | 2015-05-03 00:00:00 |
| 10 | 寮犱笁9 | 2015-05-03 00:00:00 |
| 11 | 寮犱笁10 | 2015-05-03 09:18:01 |
+----+----------+---------------------+
11 rows in set (0.00 sec)
那么之所以会出现上面的乱码问题是因为mysql命令行窗口根本就无法以utf-8的格式返回数据。
二、解决方法
登录之后,通过命令行将mysql客户端和结果集的编码格式暂时设置为gbk或gb2312,但是注意gb18030是不可以的。
mysql> set names gbk;
设置之后再通过命令查看mysql当前的编码格式
mysql> show variables like ‘character%‘;
得出结果如下:
| character_set_client | gbk
|
| character_set_connection | gbk
|
| character_set_database | utf8
|
| character_set_filesystem | binary
|
| character_set_results | gbk
|
| character_set_server | utf8
|
| character_set_system | utf8
|
| character_sets_dir | D:\Program Files (x86)\MySQL\MySQL Server 5.5\share
\charsets\ |
那么此时可以看出character_set_client, character_set_connection, character_set_results的编码格式现在为gbk。
在通过命令行查询,得出的结果如下:
+----+--------+---------------------+
| id | name | birth |
+----+--------+---------------------+
| 1 | 张三0 | 2015-05-03 00:00:00 |
| 2 | 张三1 | 2015-05-03 00:00:00 |
| 3 | 张三2 | 2015-05-03 00:00:00 |
| 4 | 张三3 | 2015-05-03 00:00:00 |
| 5 | 张三4 | 2015-05-03 00:00:00 |
| 6 | 张三5 | 2015-05-03 00:00:00 |
| 7 | 张三6 | 2015-05-03 00:00:00 |
| 8 | 张三7 | 2015-05-03 00:00:00 |
| 9 | 张三8 | 2015-05-03 00:00:00 |
| 10 | 张三9 | 2015-05-03 00:00:00 |
| 11 | 张三10 | 2015-05-03 09:18:01 |
+----+--------+---------------------+
11 rows in set (0.02 sec)
乱码的问题已经解决了。
三、知识点补充
(1) MySQL中的数据编码格式已经粒子化到 单位“列”。在建数据库的时候可以指定数据库编码格式,在这之后所建的表和列的编码格式都会以此格式为默认格式。若之后想改数据库的编码格式的话,想要把之前的表和列的编码格式都改过来的话就要一一改过来了。所以,我们要使不担心数据库的编码格式,只要在 MYSQL的安装目录下面X:\Program File\MySQL5 下面找到一个my.ini 文件,用记事本打开找到default-character-set=你要设置的编码格式 ,修改其格式即可。在后面建库、建表、建字段就不要做其它的设置,除非你要特别要求。
(2) 在用MySQL中要注意其中的数据库、表、列 对应的编码格式没有包含关系。在建库、表、列时都可以设置编码格式。
mysql> alter database testjdbc character set gbk;
mysql> alter table t_user character set gbk;
mysql> alter table t_user modify name varchar(50) character set gbk;
(3) 查看数据库、表、字段的编码格式
1) 查看数据库编码格式
mysql> show create database testjdbc;
+----------+------------------------------------------------------------------+
| Database | Create Database |
+----------+------------------------------------------------------------------+
| testjdbc | CREATE DATABASE `testjdbc` /*!40100 DEFAULT CHARACTER SET gbk */ |
+----------+------------------------------------------------------------------+
1 row in set (0.00 sec)
2) 查看表和字段的编码格式
mysql> show create table t_user;
原文地址:http://blog.csdn.net/javawangbaofeng/article/details/45456819