程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL編碼格式

MySQL編碼格式

編輯:MySQL綜合教程

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)

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved