出面mysql中文亂碼最多的就是數(shù)據(jù)庫(kù)編碼的問(wèn)題了,如果我們數(shù)據(jù)庫(kù)編碼是latin1字符集,但我們直接保存gbk就有可能出現(xiàn)中文亂碼了,下面我總結(jié)了一些解決辦法.
先看我的實(shí)例,字符集出現(xiàn)錯(cuò)誤解決辦法,出現(xiàn)的問(wèn)題:
- mysql> update users
- -> set username='關(guān)羽'
- -> where userid=2;
- ERROR 1366 (HY000): Incorrect string value: 'xB9xD8xD3xF0' for column 'usern
- ame' at row 1
向表中插入中文字符時(shí),出現(xiàn)錯(cuò)誤,代碼如下:
- mysql> select * from users;
- +--------+----------+
- | userid | username |
- +--------+----------+
- | 2 | ???? |
- | 3 | ???? |
- | 4 | ?í?ù |
- +--------+----------+
- 3 rows in set (0.00 sec)
對(duì)數(shù)據(jù)庫(kù)操作:以下是查看字符集和排序方式的命令,用phpmyadmin可以直接用sql方式運(yùn)行myql>之后的命令:
- mysql> SHOW VARIABLES LIKE 'character_set_%';
- +————————–+—————————-+
- | Variable_name | Value |
- +————————–+—————————-+
- | character_set_client | latin1 |
- | character_set_connection | latin1 |
- | character_set_database | latin1 |
- | character_set_results | latin1 |
- | character_set_server | latin1 |
- | character_set_system | latin1 |
- | character_sets_dir | /usr/share/mysql/charsets/ |
- +————————–+—————————-+
- 7 rows in set (0.00 sec)
- mysql> SHOW VARIABLES LIKE 'collation_%';
- +———————-+——————-+
- | Variable_name | Value | --Vevb.com
- +———————-+——————-+
- | collation_connection | latin1_swedish_ci |
- | collation_database | latin1_swedish_ci |
- | collation_server | latin1_swedish_ci |
- +———————-+——————-+
- 3 rows in set (0.00 sec)
使用php讀出數(shù)據(jù),需要加入:mysql_query("SET NAMES 'LATIN1'")
此時(shí)會(huì)發(fā)現(xiàn)latin1輸出的中文亂碼在頁(yè)面顯示已經(jīng)可以正常,頁(yè)面的編碼是gbk,這時(shí)正常就說(shuō)明讀取出來(lái)的中文字是gbk編碼的了,再插入utf8存儲(chǔ)的數(shù)據(jù)庫(kù)時(shí)因?yàn)閿?shù)據(jù)格式不正常,無(wú)法正常插入,此時(shí)就需要用php來(lái)進(jìn)行數(shù)據(jù)的轉(zhuǎn)碼.
iconv('gbk','utf-8',XXXXX);
這里要注意,如果要導(dǎo)入到utf8字符集的DB中是設(shè)定的原先插入到latin1 db中的原始編碼格式,本文中的測(cè)試后確定為gbk編碼,轉(zhuǎn)為utf8,因此用網(wǎng)頁(yè)的編碼方式不斷調(diào)試輸出,直到頁(yè)面呈現(xiàn)正常的中文字符為止,這種方法可以逆向推出插入db時(shí)的中文字符編碼格式.
MySQL 5.5的修改字符集編碼為UTF8,徹底解決中文亂碼問(wèn)題.
最簡(jiǎn)單的完美修改方法,修改mysql的my.cnf文件中的字符集鍵值,注意配置的字段細(xì)節(jié):
1、在[client]字段里加入default-character-set=utf8,如下:
- [client]
- port = 3306
- socket = /var/lib/mysql/mysql.sock
- default-character-set=utf8
2、在[mysqld]字段里加入character-set-server=utf8,如下:
- [mysqld]
- port = 3306
- socket = /var/lib/mysql/mysql.sock
- character-set-server=utf8
3、在[mysql]字段里加入default-character-set=utf8,如下:
- [mysql]
- no-auto-rehash
- default-character-set=utf8
修改完成后,service mysql restart重啟mysql服務(wù)就生效,注意:[mysqld]字段與[mysql]字段是有區(qū)別的.
新聞熱點(diǎn)
疑難解答
圖片精選