码迷,mamicode.com
首页 > 数据库 > 详细

MySQL编码格式

时间:2015-05-03 12:08:29      阅读:186      评论:0      收藏:0      [点我收藏+]

标签: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中要注意其中的数据库、表、列 对应的编码格式没有包含关系。在建库、表、列时都可以设置编码格式。

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;
+--------+----------------------------------------------------
--------------------------------------------------------------
-----------------------------------------------------------+
| Table  | Create Table

                                                           |
+--------+----------------------------------------------------
--------------------------------------------------------------
-----------------------------------------------------------+
| t_user | CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(40) CHARACTER SET utf8 DEFAULT NULL,
  `birth` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+--------+----------------------------------------------------
--------------------------------------------------------------
-----------------------------------------------------------+
1 row in set (0.00 sec)


MySQL编码格式

标签:mysql   编码格式   

原文地址:http://blog.csdn.net/javawangbaofeng/article/details/45456819

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!