设为首页 加入收藏

TOP

MySQL编码格式(一)
2015-11-21 03:26:41 来源: 作者: 【 】 浏览:17
Tags:MySQL 编码 格式

一、问题引出

在安装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中要注

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mysql的基本数据类型 下一篇MySQL-procedure(loop,repeat)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: