在程式開發中,有時會被字元亂碼的問題所困擾。對此,必須理解 mysql 的字符集編碼設定的原理:在mysql中,預設使用的是lartin1,也就是iso8859-1字符集編碼。這是一種8位的編碼,適用於所有西歐字元。而對於漢字等是不合適的。最好、最通用的編碼格式是utf-8,utf-8(8 位元 universal character set/unicode transformation format)是一種針對unicode 的可變長度位元組編碼的unicode字符集。它對英文使用8位(即乙個位元組),中文使用24位(三個位元組)來編碼。所以對於8位的西歐字符集來說,更能比較節省空間,而又能夠有效地表示漢字等字元。 mysql伺服器對字符集和校對規則有4個級別的預設設定:伺服器級、資料庫級、表級和連線級。
一、mysql預設字符集
mysql對於字符集的指定可以細化到乙個資料庫,一張表,一列,應該用什麼字符集。但是,傳統的程式在建立資料庫和資料表時並沒有使用那麼複雜的配置,它們用的是預設的配置:
(1)編譯mysql 時,指定了乙個預設的字符集,這個字符集是 latin1;
(2)安裝mysql 時,可以在配置檔案 (my.ini) 中指定乙個預設的的字符集,如果沒指定,這個值繼承自編譯時指定的;
(3)啟動mysqld 時,可以在命令列引數中指定乙個預設的的字符集,如果沒指定,這個值繼承自配置檔案中的配置,此時 character_set_server 被設定為這個預設的字符集;
(4)當建立乙個新的資料庫時,除非明確指定,這個資料庫的字符集被預設設定為character_set_server;
(5)當選定了乙個資料庫時,character_set_database 被設定為這個資料庫預設的字符集;
(6)在這個資料庫裡建立一張表時,表預設的字符集被設定為 character_set_database,也就是這個資料庫預設的字符集;
(7)當在表內設定一欄時,除非明確指定,否則此欄預設的字符集就是表預設的字符集;
總結:如果什麼地方都不修改,那麼所有的資料庫的所有表的所有欄的都用 latin1 儲存,不過我們如果安裝 mysql,一般都會選擇多語言支援,也就是說,安裝程式會自動在配置檔案中把 default_character_set 設定為 utf-8,這保證了預設情況下,所有的資料庫的所有表的所有欄的都用 utf-8 儲存。
二、檢視預設字符集
檢視系統的字符集和校對的設定可以通過下面的兩條命令:
1. mysql> show variables like 'character%';
2. mysql> show variables like 'collation_%';
三、修改預設字符集
(1) 最簡單的修改方法,就是修改mysql的my.ini檔案中的字符集鍵值,
如:default-character-set = utf8
character_set_server = utf8
修改完後,重啟mysql的服務,service mysql restart
(2) 還有一種修改字符集的方法,就是使用mysql的命令,如:
mysql> set character_set_client = utf8 ;
mysql> set character_set_connection = utf8 ;
mysql> set character_set_database = utf8 ;
mysql> set character_set_results = utf8 ;
mysql> set character_set_server = utf8 ;
mysql> set collation_connection = utf8 ;
mysql> set collation_database = utf8 ;
mysql> set collation_server = utf8 ;
有時設定了表的預設字符集為utf8並且通過utf-8編碼傳送查詢,你會發現存入資料庫的仍然是亂碼。問題就出在這個connection連線層上。解決方法是在傳送查詢前執行一下下面這句:
set names 'utf8';set names顯示客戶端傳送的sql語句中使用什麼字符集。因此,set names 'utf8' 語句告訴伺服器「將來從這個客戶端傳來的資訊採用字符集'utf8'。它還為伺服器傳送回客戶端的結果指定了字符集。
它相當於下面的三句指令:
mysql> set character_set_client = utf8;
mysql> set character_set_results = utf8;
mysql> set character_set_connection = utf8;
新建資料庫時指定庫的編碼:
create database dbname default character set utf8 default collate utf8_general_ci;
新建資料表時指定表的編碼:
create table tablename (uid smallint(5) unsigned not null auto_increment,username char(50) not null default '',primary key(uid))type=myisam default charset=utf8
mysql 資料庫編碼問題
檢視資料庫編碼格式 show variableslike character set database 檢視資料表的編碼格式 showcreatetable 表名 建立資料庫時指定資料庫的字符集 create database 資料庫名 character set utf8 建立資料表時指定資料表的...
mysql 資料庫編碼問題
開始發現 character set database 屬性的編碼是跟其它的屬性不一至,使用 set character set database gbk 來修改的話,mysql重啟後,並沒有改過來,之後使用alter database blog4j ph character set gbk 修改資...
Mysql資料庫編碼轉換問題
現在做乙個物料管理專案,用的是 資料庫,亂碼問題,在網上找到了答案,現和大家一起享,轉換的基本思想是把資料庫用原字符集把資料匯出,然後用新的字符集把資料匯入。現假設資料庫名是 21php,資料庫連線的使用者和密碼都是21php,連線主機是 localhost。下面是轉換操作步驟,1.匯出 mysql...