天天看點

MySQL 5.5 更改預設字元集

首先,MySQL的字元集問題主要是兩個概念,

一個是Character Sets,

一個是Collations,

前者是字元内容及編碼,後者是對前者進行比較操作的一些規則。這兩個參數集可以在資料庫執行個體、單個資料庫、表、列等四個級别指定。

對于使用者來說,一般推薦使用utf8編碼來存儲資料。而要解決亂碼問題,不單單是MySQL資料的存儲問題,還和使用者的程式檔案的編碼方式、使用者程式和MySQL資料庫的連接配接方式都有關系。

首先,MySQL有預設的字元集,這個是安裝的時候确定的,在編譯MySQL的時候可以通過DEFAULT_CHARSET=

utf8和DEFAULT_COLLATION=utf8_general_ci這兩個參數(MySQL5.5版本,5.1版本用--with-charset=

utf8 --with-collation=utf8_general_ci)來指定預設的字元集為utf8,這也是最一勞永逸的辦法,這樣指定後,

用戶端連接配接到資料庫的編碼方式也預設是utf8了,應用程式不需要任何處理。

但是遺憾的是,很多人編譯安裝MySQL的時候沒有指定這兩個參數,大多數人更是通過二進制程式的方式安裝,那麼這時候MySQL的預設字元集是latin1。而這時候我們仍然可以指定MySQL的預設字元集,通過my.cnf檔案增加

兩個參數:

1.在[mysqld]下添加

<code>default</code><code>-</code><code>character</code><code>-</code><code>set</code><code>=utf8(mysql 5.5 版本添加</code><code>character</code><code>-</code><code>set</code><code>-server=utf8)</code>

<code>2.在[client]下添加</code>

<code>default</code><code>-</code><code>character</code><code>-</code><code>set</code><code>=utf8</code>

這樣我們建資料庫建表的時候就不用特别指定utf8的字元集了。配置檔案裡的這種寫法解決了資料存儲和比較的問題,但是對用戶端的連接配接是沒有作用的,用戶端這時候一般需要指定utf8方式連接配接才能避免亂碼。也就是傳說總的setnames指令。事實上,set names utf8指令對應的是伺服器端以下幾個指令:

<code>SET</code> <code>character_set_client = utf8;</code>

<code>SET</code> <code>character_set_results = utf8;</code>

<code>SET</code> <code>character_set_connection = xutf8;</code>

但這三個參數是不能寫在配置檔案my.cnf裡的。隻能通過set指令來動态修改。我們需要的是在配置檔案裡寫好一勞

永逸的辦法。那麼這時候,是否有在服務端解決問題的辦法呢,可行的思路是在init_connect裡設定。這個指令在每個普通使用者連接配接上來的時候都會觸發執行,可以在[mysqld]部分增加以下一行設定連接配接字元集:

在[mysqld]下添加:

<code>init_connect = </code><code>'SET NAMES utf8'</code>

這樣就簡單的解決了問題,但是要注意的是,這個指令對具有super權限的使用者是不生效的,可以簡單的測試如下:

[root@localhost init.d]# mysql -u root -p

Enter password:

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 6

Server version: 5.1.49-log MySQL Community Server (GPL)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

This software comes with ABSOLUTELY NO WARRANTY. This is free software,

and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql&gt; show variables like '%collation%';

+----------------------+-------------------+

| Variable_name        | Value             |

| collation_connection | latin1_swedish_ci |

| collation_database   | utf8_general_ci   |

| collation_server     | utf8_general_ci   |

3 rows in set (0.00 sec)

mysql&gt; show variables like '%character%';

+--------------------------+----------------------------+

| Variable_name            | Value                      |

| character_set_client     | latin1                     |

| character_set_connection | latin1                     |

| character_set_database   | utf8                       |

| character_set_filesystem | binary                     |

| character_set_results    | latin1                     |

| character_set_server     | utf8                       |

| character_set_system     | utf8                       |

| character_sets_dir       | /usr/share/mysql/charsets/ |

8 rows in set (0.00 sec)

我們看到root使用者看到的connection相關參數仍然是latin1,而普通使用者看到的卻是utf8。

實際上,對于mysql,mysqladmin, mysqlcheck, mysqlimport和mysqlshow這些用戶端指令程式,可以設定以下參數在配置檔案的

[client]部分,為這些程式指定預設用utf8編碼和連接配接:

<code>default</code><code>-</code><code>character</code><code>-</code><code>set</code> <code>= utf8</code>

網上很多資料(包括一些大公司的所謂牛人)說加上這一行就能徹底解決亂碼問題,這是不正确的,這個參數隻對以上幾個官方的用戶端程式有用,對普通的第三方程式,比如php代碼是無效的。

當然,這個參數可以友善DBA的管理,還是很有用的,而這個參數也能解釋為什麼DBA看到的内容和普通使用者看到的内容有時會有差異。

除了資料庫的存儲,連接配接資料庫的方式,還有就是程式本身的編碼也要是utf8方式來儲存,當然這與MySQL資料庫已經無關了,而是用戶端顯示的問題。

總結一下就是:

1、首選在編譯安裝MySQL的時候指定兩個參數使用utf8編碼。

2、次選在配置檔案my.cnf設定兩個參數,同時設定init_connect參數。

3、第三在配置檔案my.cnf設定兩個參數,同時用戶端的連接配接指定set names指令。

4、在配置檔案my.cnf裡加入default-character-set參數友善管理。

      本文轉自crazy_charles 51CTO部落格,原文連結:http://blog.51cto.com/douya/1840045,如需轉載請自行聯系原作者