MySQL字符集設置及字符轉換(latin1轉utf8)

 MySQL字符集設置及字符轉換(latin1轉utf8)

http://blog.chinaunix.net/uid-25266990-id-3344584.htmlcss

分類: Mysql/postgreSQLhtml

 

在生成環境中,會常常碰到Mysql字符的設置問題,CU不少牛人都說過N次了,我的也總結下。mysql

若是在應用開始階段沒有正確的設置字符集,在運行一段時間之後才發現存在不能知足要求須要調整,那麼就須要進行字符集的修改。字符集的修改不能直接經過alter dataabase character set ***; 或者 alter table tablename character set ***; 命令進行,這兩個命令都沒有更新已有記錄的字符集,而只是對新建立的表或者記錄生效。web

在筆者的數據庫最爲經常使用的是latin1utf8,因爲項目的整合,字符的要求也開始規範,統一爲utf8,那麼就須要把以前的latin1字符轉換成才utf8格式,那樣纔不會出現亂碼的狀況。已有的記錄的字符集調整,須要先將數據導出,通過適當的調整從新導入後纔可完成。sql

如下模擬的是將latin1字符集的數據庫修改爲GBK字符集的數據庫的過程。操做較爲簡單,只要花的時間是在導入和導出數據。下面就來簡單的介紹Mysql字符變量和latin1轉換到utf8的過程,你們能夠根據本身實際狀況,觸類旁通。數據庫

1、MySQL字符集設置緩存

• 系統變量:服務器

– character_set_server:默認的內部操做字符集post

– character_set_client:客戶端來源數據使用的字符集測試

– character_set_connection:鏈接層字符集

– character_set_results:查詢結果字符集

– character_set_database:當前選中數據庫的默認字符集

– character_set_system:系統元數據(字段名等)字符集

– 還有以collation_開頭的同上面對應的變量,用來描述字符序。

• introducer指定文本字符串的字符集:

– 格式爲:[_charset] ‘string’ [COLLATE collation]

– 例如:

• SELECT _latin1 ‘string’;

• SELECT _utf8 ‘你好’ COLLATE utf8_general_ci;

introducer修飾的文本字符串在請求過程當中不通過多餘的轉碼,直接轉換爲內部字符集處理。

2、MySQL中的字符集轉換過程

1. MySQL Server收到請求時將請求數據從character_set_client轉換爲character_set_connection

2. 進行內部操做前將請求數據從character_set_connection轉換爲內部操做字符集,其肯定方法以下:

• 使用每一個數據字段的CHARACTER SET設定值;

• 若上述值不存在,則使用對應數據表的DEFAULT CHARACTER SET設定值(MySQL擴展,非SQL標準)

• 若上述值不存在,則使用對應數據庫的DEFAULT CHARACTER SET設定值;

• 若上述值不存在,則使用character_set_server設定值。

3. 將操做結果從內部操做字符集轉換爲character_set_results

 

3、latin1轉換到utf8

以原來的字符集爲latin1爲例,升級成爲utf8的字符集。原來的表: databasename (default charset=latin1),新表:new_databasename(default charset=utf8)

 

  1. mysql> show create database databasename; 
  2. +--------------+-------------------------------------------------------------------------+
  3. | Database | Create Database |
  4. +--------------+-------------------------------------------------------------------------+
  5. | databasename | CREATE DATABASE `databasename` /*!40100 DEFAULT CHARACTER SET latin1 */ | 
  6. +--------------+-------------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)

 

1> 導出表結構:

 

  1. mysqldump -uroot -p --default-character-set=utf8 -d databasename > createtab.sql

 

 

其中--default-character-set=utf8 表示設置以什麼字符集鏈接, -d 表示只導出表結構,不導出數據。

2>修改 createtab.sql 中表結構定義中的字符集爲新的字符集。

 

  1. sed -i s/CHARSET=latin1/CHARSET=utf8/g `grep -rl "CHARSET=latin1" createtab.sql `

 

3>確保記錄再也不更新,導出全部記錄。

 

  1. mysqldump -uroot -p --no-create-info 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 utf8 。

 

  1. sed -i s/CHARSET=latin1/CHARSET=utf8/g `grep -rl "CHARSET=latin1" data.sql `

 

 

(PSsed工做效率是很是高的,在測試中60G的數據4分鐘就轉換完畢了

 

5>使用新的字符集建立新的數據庫。

 

  1. create database new_databasename default charset utf8;

 

6>建立表,執行 createtab.sql

 

  1. mysql -uroot -p new_databasename < createtab.sql

 

7>導入數據,執行data.sql

 

  1. mysql -uroot -p new_databasename < data.sql
八、查看新數據庫的字符信息

 



  1. mysql> show create database new_databasename;
  2. +------------------+-----------------------------------------------------------------------------+
  3. | Database | Create Database |
  4. +------------------+-----------------------------------------------------------------------------+
  5. | new_databasename | CREATE DATABASE `new_databasename` /*!40100 DEFAULT CHARACTER SET utf8 */ | 
  6. +------------------+-----------------------------------------------------------------------------+
  7. 1 row in set (0.00 sec)
  8. mysql> show create table type; 
  9. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  10. | Table | Create Table |
  11. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  12. | type | CREATE TABLE `type` (
  13.   `id` int(10) NOT NULL AUTO_INCREMENT,
  14.   `Name` varchar(100) CHARACTER SET gb2312 NOT NULL,
  15.   PRIMARY KEY (`id`)
  16. ) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 | 
  17. +-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  18. 1 row in set (0.00 sec)

注意:選擇字符集的時候,要注意最好是源字符的超集,或者肯定比源字符集的字庫更大

相關文章
相關標籤/搜索