這兩天在學習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;