一、問題引出
在安裝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)