mysql編碼設置(轉)

[size=medium]查看系統的字符集和排序方式的設定可以通過下面的兩條命令或mysql> status 。

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

上面列出的值就是系統的默認值。(很奇怪系統怎麼默認是latin1的瑞典語排序方式)...

當我們按照原來的方式通過PHP存取MySQL數據庫時,就算設置了表的默認字符集爲utf8並且通過UTF-8編碼發送查詢,你會發現存入數據庫的仍然是亂碼。問題就出在這個connection連接層上。解決方法是在發送查詢前執行一下下面這句:

1. SET NAMES 'utf8';

它相當於下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

2. 創建數據庫
mysql> create database name character set utf8;

3. 創建表
CREATE TABLE `type` (
`id` int(10) unsigned NOT NULL auto_increment,
`flag_deleted` enum('Y','N') character set utf8 NOT NULL default 'N',
`flag_type` int(5) NOT NULL default '0',
`type_name` varchar(50) character set utf8 NOT NULL default '',
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;

4. 修改數據庫成utf8的.
mysql> alter database name character set utf8;

5. 修改表默認用utf8.
mysql> alter table type character set utf8;

6. 修改字段用utf8
mysql> alter table type modify type_name varchar(50) CHARACTER SET utf8;

default-character-set=utf8
default-collation=utf8_unicode_ci
character-set-server=utf8
重啓

一、MySQL字符集和校對規則
我們都知道,字符集就是一套文字符號及其編碼、比較規則的集合,因爲計算機只認識二進制代碼,所有我們必須要有一個轉換。
MySQL的字符集包括字符集(Character Set)和校對規則(Collation)兩個概念。字符集是用來定義MySQL存儲字符串的方式,而校對規則則定義了比較字符串的方式。
字符集和校對規則是一對多的關係,每個字符集至少對應一個校對規則,稱爲默認校對規則。
查看所有字符集的命令:show character set;
或是查看information_schema.character_sets,可以得到所有的字符集和它的默認的校對規則,它的表結構:desc information_schema.character_sets;
查看字符集的校對規則:show collation like 'GBK%';
校對規則命名約定:以其相關的字符集名開始,通常包括一個語言名,並且以_ci(大小寫不敏感)、_cs(大小寫敏感)或_bin(二元,即比較是基於字符編碼的值而與語言無關)結束。
實驗命令:
select case when 'A' COLLATE utf8_general_ci = 'a' COLLATE utf8_general_ci then 'YES' else 'NO' end;(YES)
select case when 'A' COLLATE gbk_chinese_ci = 'a' COLLATE gbk_chinese_ci then 'YES' else 'NO' end;(YES)
select case when 'A' COLLATE gbk_bin = 'a' COLLATE gbk_bin then 'YES' else 'NO' end;(NO)

二、設置字符集
MySQL的字符集和校對規則有4個級別的默認設置:服務器級、數據庫級、表級和字段級。
服務器級:
[mysqld]
default-character-set=utf8
[mysql]
default-character-set=utf8
或是啓動時加上參數:mysqld --default-character-set=utf8
或是編譯時加上參數:./configure --width-charset=utf8
查看字符集和校對規則:
show variables like 'character_set_server';
show variables like 'collation_server';

數據庫級:
查看字符集和校對規則:
show variables like 'character_set_database';
show variables like 'collation_database';

表級:
查看字符集和校對規則:
show create table t \G

四、簡單修改字符集
簡單修改只對以後的數據有影響,如果數據庫中沒有數據或是不想修改以前的數據,可以使用簡單修改。
簡單修改命令:
alter database character set utf8;
alter table t character set utf8;
個人推薦在創建數據庫時明確指定字符集和校對規則,避免受到默認值的影響。
創建數據庫時指定:
create database databasename default charset GBK;
創建數據表時指定:
create table tablename(
....
) ENGIND=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

五、完全修改字符集
當數據庫中已有數據,想修改數據集,不能通過簡單的修改字符集完成,需要先將原數據導出,經過適當調整後重新導入纔可完成。
通過七步完成字符集的完全修改(假設原字符集是latin1,想修改成GBK)。
1、導出表結構:
mysqldump -uroot -p --default-character-set=GBK -d databasename>createdb.sql
說明:
--default-character-set=GBK 表示設置以什麼字符集連接;
-d 表示只導出表結構,不導出數據。
2、手工修改createdb.sql中表結構定義中的字符集(latin1)爲新的字符集(GBK);
3、確保數據庫中的數據不再更新,導出所有的數據:
mysqldump -uroot -p --quick --no-create-info --extended-insert --default-character-set=latin1 databasename>data.sql
說明:
--quick 該選項用於轉儲大的表,它強制mysqldump從服務器一次一行地檢索表中的行而不是檢索所有行,並在輸出前將它緩存到內存中;
--extended-insert 使用包括幾個values的多行insert語法;
--no-create-info 不要create table語句;
--default-character-set=latin1 表示按照原有的字符集導出所有的數據。
4、打開data.sql,將set names latin1修改成set names GBK;
5、使用新的字符集創建數據庫:
create database databasename default charset GBK;
6、創建表:
mysql -uroot -p databasename < createdb.sql
7、導入數據:
mysql -uroot -p databasename < data.sql

六、最後
建議服務器的字符集參數不要修改,而是是創建數據庫進加上字符集,特別是在創建表時記得加上,這樣做的目的是爲了使修改的影響最小化。[/size]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章