標籤:
首先,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]下添加
default-character-set=utf8(mysql 5.5 版本添加character-set-server=utf8)
2.在[client]下添加
default-character-set=utf8
這樣我們建資料庫建表的時候就不用特別指定utf8的字元集了。設定檔裡的這種寫法解決了資料存放區和比較的問題
,但是對用戶端的串連是沒有作用的,用戶端這時候一般需要指定utf8方式串連才能避免亂碼。也就是傳說總的set
names命令。事實上,set names utf8命令對應的是伺服器端以下幾個命令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = xutf8;
但這三個參數是不能寫在設定檔my.cnf裡的。只能通過set命令來動態修改。我們需要的是在設定檔裡寫好一勞
永逸的辦法。那麼這時候,是否有在服務端解決問題的辦法呢,可行的思路是在init_connect裡設定。這個命令在每
個普通使用者串連上來的時候都會觸發執行,可以在[mysqld]部分增加以下一行設定串連字元集:
在[mysqld]下添加:
init_connect = ‘SET NAMES utf8‘
總結:
1、首選在編譯安裝MySQL的時候指定兩個參數使用utf8編碼。
2、次選在設定檔my.cnf或my.ini設定兩個參數,同時設定init_connect參數。
3、第三在設定檔my.cnf或my.ini設定兩個參數,同時用戶端的串連指定set names命令。
4、在設定檔my.cnf裡的client和server處加入default-character-set參數方便管理。
1 -------用戶端---- 2 [client] 3 no-beep 4 5 # pipe 6 # socket=mysql 7 port=3306 8 9 [mysql]10 11 default-character-set=gb231212 13 -----伺服器----14 15 # The default character set that will be used when a new schema or table is16 # created and no character set is defined17 character-set-server=gb2312
更改my.ini檔案client、server的字元集
1.service mysqld stop,停用mysql。
2.cp /etc/my.cnf /etc/my.cnf.bak,修改前做備份,這是個好習慣。
修改my.cnf或my.ini(只有修改設定檔,並重啟伺服器,才能永久生效)
vi /etc/my.cnf
在[client]下添加,client為控制用戶端的,沒試過,沒有的可以不需要加。
default-character-set=utf8
在[mysqld]下添加,mysqld為控制伺服器端的,改過了,OK。
default-character-set=utf8
3.service mysqld restart,重啟。
4.show variables like ‘%char%‘;查看。
以下為網路轉載,比較全。
//////////////////////////////////////////
查看mysql字元集MySQL 亂碼的根源是的 MySQL 字元
ubuntu 10.04 mySql 啟動,停止,重啟啟動:sudo /etc/init.d/mysql start
停止:sudo /etc/init.d/mysql stop
重啟:sudo /etc/init.d/mysql restart
注意:從windows下拷貝過來的檔案在linux下不能直接加入資料庫,因為字元集不一樣,這樣開啟即使顯示是中文也不能在資料庫中顯示,要把檔案拷貝進linux的另一個檔案中轉換字元才可以。
MySQL 亂碼的根源是的 MySQL 字元集設定不當的問題,本文匯總了有關查看 MySQL 字元集的命令。包括查看 MySQL 資料庫伺服器字元集、查看 MySQL 資料庫字元集,以及資料表和欄位的字元集、當前安裝的 MySQL 所支援的字元集等。
一、查看 MySQL 資料庫伺服器和資料庫字元集。
mysql> show variables like ‘%char%‘;
二、查看 MySQL 資料表(table) 的字元集。
mysql> show table status from sqlstudy_db like ‘%countries%‘;
三、查看 MySQL 資料列(column)的字元集。
mysql> show full columns from countries;
四、查看當前安裝的 MySQL 所支援的字元集。
mysql> show charset;
mysql> show char set;
以上查看 MySQL 字元集命令,適用於 Windows & Linux。
1.尋找MySQL的cnf檔案的位置
find / -iname ‘*.cnf‘ -print
/usr/share/mysql/my-innodb-heavy-4G.cnf
/usr/share/mysql/my-large.cnf
/usr/share/mysql/my-small.cnf
/usr/share/mysql/my-medium.cnf
/usr/share/mysql/my-huge.cnf
/usr/share/texmf/web2c/texmf.cnf
/usr/share/texmf/web2c/mktex.cnf
/usr/share/texmf/web2c/fmtutil.cnf
/usr/share/texmf/tex/xmltex/xmltexfmtutil.cnf
/usr/share/texmf/tex/jadetex/jadefmtutil.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-innodb-heavy-4G.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-large.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-small.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-medium.cnf
/usr/share/doc/MySQL-server-community-5.1.22/my-huge.cnf
2. 拷貝 small.cnf、my-medium.cnf、my-huge.cnf、my-innodb-heavy-4G.cnf其中的一個到/etc下,命名為my.cnf
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
3. 修改my.cnf 或my.ini(5.6版本)
vi /etc/my.cnf
在[client]下添加
default-character-set=utf8
在[mysqld]下添加
default-character-set=utf8
4.重新啟動MySQL
[[email protected] ~]# /etc/rc.d/init.d/mysql restart
Shutting down MySQL [ 確定 ]
Starting MySQL. [ 確定 ]
[[email protected] ~]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.22-rc-community-log MySQL Community Edition (GPL)
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the buffer.
其他的一些設定方法:
通過設定檔修改:
修改/var/lib/mysql/mydb/db.opt
default-character-set=latin1
default-collation=latin1_swedish_ci
為
default-character-set=utf8
default-collation=utf8_general_ci
重起MySQL:
[[email protected] ~]# /etc/rc.d/init.d/mysql restart
1.更改用戶端、伺服器、資料庫字元集的命令:
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 character_set_system=utf8;
mysql> set collation_connection=utf8;
mysql> set collation_database=utf8;
mysql> set collation_server=utf8;
2.查看字元集:
show variables like ‘collation_%‘;
show variables like ‘character_set_%‘;
3.設定資料庫字元集:
#修改資料庫字元集
alter database mini default character set = gb2312;
#建立資料庫設定字元集
create database mydb character set gb2312;
4.修改單個表字元集:
alter table pub_logs default character set = gb2312;
alter table pub_logs convert to character set gb2312;
5.產生批量更改表字元集:
SELECT a.TABLE_TYPE,CONCAT(‘alter TABLE ‘,A.TABLE_NAME,‘ default character set = gb2312;‘) FROM INFORMATION_SCHEMA.TABLES A
WHERE A.TABLE_SCHEMA=‘MINI‘ AND a.TABLE_TYPE=‘BASE TABLE‘;
6.產生批量更改列字元集
SELECT CONCAT(CONCAT(CONCAT(‘alter TABLE ‘,c.TABLE_NAME,‘ modify‘),CONCAT(‘ ‘,C.COLUMN_NAME,‘ ‘),C.COLUMN_TYPE),‘ ‘,‘ character set gb2312 COLLATE gb2312_chinese_ci;‘) AS CLOU
FROM
INFORMATION_SCHEMA.COLUMNS C,INFORMATION_SCHEMA.TABLES A
WHERE c.TABLE_SCHEMA=‘MINI‘
AND A.TABLE_NAME=c.TABLE_NAME
AND A.TABLE_TYPE=‘BASE TABLE‘
AND c.DATA_TYPE=‘varchar‘;
MySQL預存程序的字元集問題
MySQL預存程序中經常會出現字元集的問題,這就需要大家掌握MySQL預存程序中出現字元集問題的處理方法,下文中就將給大家解析MySQL預存程序中出現的字元集問題。
MySQL儲存是MySQL資料庫操作中非常重要的一個工作,也是大家平時工作中都要應用到的。由於預存程序中定義參數時,無法定義其字元集,因此調用預存程序的時候,會預設讀取全域變數character_set_server,而且還是唯讀取mysqld啟動時該全域變數的值作為預存程序中預設的傳輸字元集。因此,如果資料表/欄位使用系統預設的字元集(比如latin1)的話,調用預存程序更新一些非英文的字串欄位時,就不會發生問題;但是,如果資料表/欄位的字元集不是系統預設的字元集(比如預設是latin1,資料表使用的是utf8),就會出現問題了。
解決辦法:
在my.cnf(windows下是my.ini),增加一行:
default-character-set=utf8
或者
character-set-server=utf8
也可以。如果只是在mysqld啟動之後,在 mysql 命令列中用 SET 文法來更新的話則不起作用。
mysql字元集問題