http://www.cnblogs.com/livingintruth/p/3433259.html
這兩天在學習webpy,把webpy的一個blog例子扒下來學習一下,預設建立的table當存入中文的時候是亂碼,研究了一下這個問題。
1,建立table的時候就使用utf8編碼
舉個例子:
1 create table entries2 ( 2 id int auto_increment, 3 title text, 4 content text, 5 posted_on datetime, 6 primary key (id) 7 ) character set = utf8;
在每次建立表的時候都在最後加上
character set = utf8
就可以很好的支援中文。
2,修改已經有的table的編碼
當使用預設編碼建立了一個table的時候,是不能支援中文的,這時候使用如下語句對table_name進行修改:
alter table table_name convert to character set utf8;
此後再往這個table插入中文的時候,就可以正常儲存和讀取了,但不知道為什麼之前的亂碼還是不能糾正,只能新插入的資料沒有問題。
[注意] 我google了一下,有些地方說這個命令也行,但是我測試以後並不行
alter table table_name charset=utf8; #這個語句並沒有讓table_name支援中文
修改table編碼前:
修改為utf8後並插入一行資料:
可以看到已支援中文,但之前的3行還是沒有改變。
3,修改table中一個column的編碼
這個我目前還沒發現需要在實際中使用到,但是測試了很多次,語句如下:
alter table entries modify title mediumtext character set utf8;
其中entries是我的table名,title是我要修改的column欄位,mediumtext是title的型別。
即使是修改table某個欄位的編碼,也沒有做到讓之前的亂碼變成中文。
4,如何檢視一個database,一個table的編碼
檢視database的編碼,假如database名字為webpy:
show create database webpy;
檢視一個table的編碼,假如table名為entries2:
show create table entries2;
效果如下,其實表中每個欄位編碼都是utf8,表的default的utf8的,所以沒有單獨顯示每個欄位的。
5,修改mysql的配置檔案,讓mysql預設編碼為utf8
在我的ubuntu機器上,mysql的配置目錄為/etc/mysql
而我們mysql使用的配置檔案為
/etc/mysql/my.cnf
我們可以直接加在my.cnf中,當然為了方便移植可複用,也可以如下寫在獨立的配置檔案中。
在my.cnf最後又include了 conf.d/ 下面所有的*.cnf檔案,所以我們就在conf.d/下面加上一個我們自己的配置檔案wy_sql.cnf
新增如下兩行
[mysqld] character-set-server=utf8
再建立表的時候預設編碼就是utf8了。
6, 顯示的問題
上面改了伺服器的字元編碼,但是如果不改client的,在終端上顯示的還是???
還需要在配置檔案中加上
[client] default-character-set=utf8
通過
show variables like '%char%'
可以檢視
和編碼 "character" , 有關的變數
Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ |
7, 直接在mysql中使用 set 設定 變數
上面我們用show 檢視了一些變數的值
那麼可以直接用set來設定,但是這是臨時的,下次啟動後還是以配置檔案的為準
set character_set_result = utf8