MySQL 4.1的字元集支援(Character Set Support)有兩個方面:字元集(Character set)和排序方式(Collation)。對於字元集的支援細化到四個層次: 伺服器(server),資料庫(database),資料表(table)和串連(connection)。下面將分兩部分,分別設定伺服器編碼和資料庫、資料表與串連部分的編碼,從而杜絕中文亂碼的出現。
一 伺服器編碼設定
伺服器編碼設定方法有二:
一是安裝mysql時,其中會有一個步驟選擇編碼方式,此時選擇gbk即可。如果不選擇,預設的編碼是latin1;
二是在安裝玩mysql之後,手動修改其設定檔,如下:
(1)修改 MySql安裝目錄下面的my.ini(MySQL Server Instance Configuration 檔案)。 設定
default-character-set=gbk(注意,有2處)
(2)修改data目錄中相應資料庫目錄下的db.opt設定檔 default-character-set=gbk default-collation=gbk_chinese_ci 重啟資料庫,關閉控制台視窗重新登入資料庫即可。
二 資料庫、資料表和串連部分的編碼設定
2.1 設定資料庫和資料表編碼 要解決亂碼問題,首先必須弄清楚資料庫和資料表用什麼編碼。
如果沒有指明,將是預設的latin1。
用得最多的應該是這3種字元集 gb2312,gbk,utf8。
如何去指定資料庫和資料表的字元集呢?下面也gbk為例:
【在MySQL Command Line Client建立資料庫 】
mysql> CREATE TABLE `mysqlcode` (
-> `id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
-> `content` VARCHAR( 255 ) NOT NULL
-> )
TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
Query OK, 0 rows affected, 1 warning (0.03 sec)
其中後面的TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
就是指定資料庫的字元集,COLLATE (校勘),讓mysql同時支援多種編碼的資料庫。
當然也可以通過如下指令修改資料庫資料表的字元集:
alter database mysqlcode default character set 'gbk'.
前面已經設定了伺服器、資料庫和資料表的編碼,那麼資料庫中的編碼便都是gbk,中文可以儲存進去。但是如果你要通過執行insert或select等操作時,仍然會出現中文亂碼問題,這是因為還沒設定“串連(connection)”部分的編碼,而insert、select等資料庫操作都包含與資料庫的串連動作。如果不信,你現在可以執行下面的sql文試一試: mysql> insert into mysqlcode values(null,'java愛好者');
按斷行符號,結果如下: ERROR 1406 (22001): Data too long for column 'content' at row 1
2.2 設定串連編碼 設定了伺服器、資料庫和資料表部分的編碼,必須設定串連編碼。串連編碼設定如下: mysql> SET character_set_client='gbk';
mysql> SET character_set_connection='gbk'
mysql> SET character_set_results='gbk'
設定好串連編碼,下面便可以成功插入中文了: mysql> insert into mysqlcode values(null,'java愛好者');
Query OK, 0 rows affected (0.02 sec)
其實,上面設定串連編碼的三條命令可以簡化為一條: mysql> set names 'gbk'; 設定好了串連編碼後,在select查詢時,也能正確顯示中文: mysql> select * from mysqlcode;
+----+-----------+
| id | content |
+----+-----------+
| 1 | java愛好著 |
+----+-----------+
1 row in set (0.00 sec)
三 完整樣本 下面將用一個例子完整地將上面的理論示範一遍,最後達到能向mysql中插入中文的目的:
3.1 設定mysql伺服器編碼 這一步請參見上文第一節,主要就是在安裝mysql之後,修改my.ini和dataTable.db中的編碼為gbk
3.2 建立一個資料庫 先串連到本機資料庫:mysql -h localhost -u root -proot,接著建立一個資料庫: mysql> create database test;
3.3 建立資料表並設定其編碼 -- 中文編碼測試資料表 use test
DROP TABLE IF EXISTS `test`.`test_nml`;
SET @saved_cs_client = @@character_set_client;
SET character_set_client = gbk;
CREATE TABLE `test`.`test_nml` (
`id` TINYINT( 255 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`content` VARCHAR( 255 ) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk COMMENT='使用者基本資料';
SET character_set_client = @saved_cs_client; 這裡的紅色部分等價於上文中的
TYPE = MYISAM CHARACTER SET gbk COLLATE gbk_chinese_ci;
3.4 插入中文資料 --插入資料
SET @saved_cs_client = @@character_set_client;
set names gbk;
insert into test_nml values(null,'我是中文'); 注意:每次執行insert或update或select串連操作時,都必須設定編碼,即在前面加上:set names 'gbk';