MySQL編碼格式,mysql修改編碼格式

來源:互聯網
上載者:User

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)


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.