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。
插入資料的代碼
@Testpublic 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)