mysql中文亂碼是各種初學(xué)這類的常見(jiàn)問(wèn)題,下面我來(lái)給各位同學(xué)詳細(xì)介紹關(guān)于在mysql中文亂碼時(shí)的一些解決方法,有需要了解的朋友不防參考.
原因是很多時(shí)候,為了安全,不允許mysql管理工具連接線上的正式環(huán)境,這樣的情況下,就不能依靠mysql管理工具來(lái)轉(zhuǎn)換編碼來(lái)解決中文亂碼的問(wèn)題.
這樣的情況下只能通過(guò)putty或者secureCRT遠(yuǎn)程連接mysql server,然后通過(guò)mysql命令界面來(lái)對(duì)mysql數(shù)據(jù)庫(kù)導(dǎo)出,再做其他的編碼轉(zhuǎn)換操作,我現(xiàn)在面臨的環(huán)境就是這樣。
現(xiàn)在,描述一下我的數(shù)據(jù)情況,我需要導(dǎo)出中文亂碼的數(shù)據(jù)表account.user,代碼如下:
- mysql> show create database account;
- +———-+——————————————————————————————+
- | Database | Create Database |
- +———-+——————————————————————————————+
- | account | CREATE DATABASE `account` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */ |
- +———-+——————————————————————————————+
- 1 row in set (0.00 sec)
- mysql> show create table user;
- +———————+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————–+
- | Table | Create Table |
- +———————+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————–+
- | user_agreement_info | CREATE TABLE `user` (
- `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
- `uid` bigint(21) unsigned NOT NULL,
- `realname` char(32) NOT NULL,
- `id_type` smallint(11) unsigned NOT NULL,
- `id_num` char(32) DEFAULT NULL,
- `create_time` int(10) unsigned DEFAULT NULL,
- PRIMARY KEY (`id`),
- KEY `uid` (`uid`)
- ) ENGINE=MyISAM AUTO_INCREMENT=129287 DEFAULT CHARSET=utf8 |
- +———————+———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————–+
- 1 row in set (0.02 sec)
- #查詢數(shù)據(jù)亂碼,看下面:
- mysql> select * from user limit 10;
- +—-+————+—————————+———+——————–+————-+
- | id | uid | realname | id_type | id_num | create_time |
- +—-+————+—————————+———+——————–+————-+
- | 23 | 1000001229 | �陈 | 1 | 410101234567891234 | 1272619237 |
- | 2 | 1000001207 | �文鉴 | 1 | 320211198511261933 | 1272546559 |
- | 3 | 1000001208 | 蒋家锋 | 1 | 513023198808294915 | 1272547009 |
- | 4 | 1000001209 | zhaojing | 1 | 320822198704286120 | 1272550654 |
- | 5 | 1000001210 | 阮å°?æ¦ | 1 | 31020619840214283X | 1272562857 |
- | 6 | 1000001211 | 黑夜精� | 1 | 412723798204103835 | 1272588671 |
- | 7 | 1000001212 | 谢勇 | 1 | 330722198408168210 | 1272591799 |
- | 8 | 1000001213 | 邵�芳 | 3 | 0621316 | 1272592840 |
- | 9 | 1000001215 | �维纪 | 1 | 330382198611030393 | 1272592959 |
- | 10 | 1000001216 | 谈� | 1 | 430721198309272802 | 1272595142 |
- +—-+————+—————————+———+——————–+————-+
- 10 rows in set (0.00 sec)
- #數(shù)據(jù)庫(kù)編碼設(shè)置情況:
- mysql> show variables like ‘%char%’;
- +————————–+—————————————-+
- | Variable_name | Value |
- +————————–+—————————————-+
- | character_set_client | utf8 |
- | character_set_connection | utf8 |
- | character_set_database | utf8 |
- | character_set_filesystem | binary |
- | character_set_results | utf8 |
- | character_set_server | utf8 |
- | character_set_system | utf8 |
- | character_sets_dir | /usr/local/mysql/share/mysql/charsets/ |
- +————————–+—————————————-+
- 8 rows in set (0.02 sec)
這是什么問(wèn)題呢?首先我們來(lái)看下數(shù)據(jù)是什么編碼,代碼如下:
- mysql> set names latin1;
- Query OK, 0 rows affected (0.02 sec)
- mysql> select * from user_agreement_info limit 10;
- +—-+————+————–+———+——————–+————-+
- | id | uid | realname | id_type | id_num | create_time |
- +—-+————+————–+———+——————–+————-+
- | 23 | 1000001229 | 陳 | 1 | 410101234567891234 | 1272619237 |
- | 2 | 1000001207 | 王嘉文 | 1 | 320211198511261933 | 1272546559 |
- | 3 | 1000001208 | 網(wǎng)家鋒 | 1 | 513023198808294915 | 1272547009 |
- | 4 | 1000001209 | zaojing | 1 | 320822198704286120 | 1272550654 |
- | 5 | 1000001210 | 小林 | 1 | 31020619840214283X | 1272562857 |
- | 6 | 1000001211 | 黑夜精靈 | 1 | 412723798204103835 | 1272588671 |
- | 7 | 1000001212 | 鳳舞 | 1 | 330722198408168210 | 1272591799 |
- | 8 | 1000001213 | 邵明芳 | 3 | 0621316 | 1272592840 |
- | 9 | 1000001215 | 王維紀(jì) | 1 | 330382198611030393 | 1272592959 |
- | 10 | 1000001216 | 談宏 | 1 | 430721198309272802 | 1272595142 |
- +—-+————+————–+———+——————–+————-+
- 10 rows in set (0.01 sec) --Vevb.com
現(xiàn)在可以確定了,這個(gè)表里的數(shù)據(jù)時(shí)latin1編碼的,我們知道如果要mysql中,中文正常顯示,必須要保持編碼一致,我們看到在數(shù)據(jù)庫(kù)里執(zhí)行set names latin1之后,中文就能正常顯示,那么我們就按照這樣的方式導(dǎo)出數(shù)據(jù),代碼如下:
[root@sh-db1 tmp]# /usr/local/mysql/bin/mysqldump -uroot –opt –default-character-set=latin1 -p654321 account user >/tmp/user.sql
注意這里的導(dǎo)出參數(shù)–default-character-set=latin1,也就是相當(dāng)于我們?cè)跀?shù)據(jù)導(dǎo)出之前在數(shù)據(jù)庫(kù)里執(zhí)行set names latin1;
這樣數(shù)據(jù)就以sql腳本的方式存在于server上,使用vim查看文件/tmp/user.sql時(shí)發(fā)現(xiàn)還是亂碼,這是為什么呢?下面就是原因,代碼如下:
- [root@sh-db1 tmp]# locale
- LANG=en_US.UTF-8
- LC_CTYPE=”en_US.UTF-8″
- LC_NUMERIC=”en_US.UTF-8″
- LC_TIME=”en_US.UTF-8″
- LC_COLLATE=”en_US.UTF-8″
- LC_MONETARY=”en_US.UTF-8″
- LC_MESSAGES=”en_US.UTF-8″
- LC_PAPER=”en_US.UTF-8″
- LC_NAME=”en_US.UTF-8″
- LC_ADDRESS=”en_US.UTF-8″
- LC_TELEPHONE=”en_US.UTF-8″
- LC_MEASUREMENT=”en_US.UTF-8″
- LC_IDENTIFICATION=”en_US.UTF-8″
- LC_ALL=
還有跟你的連接工具的編碼有關(guān)系,去查看一下你的putty或者secureCRT連接使用的是什么編碼,這些不同的編碼就是造成你使用vim查看中文顯示亂碼的原因。
沒(méi)有關(guān)系,我們使用sz命令把/tmp/user.sql下載到本地,也就是你的windows主機(jī)上。
然后使用emedtor或者uedtor,notepad++,vim都可以,打開,發(fā)現(xiàn)中文已經(jīng)可以正常顯示,如果不正常顯示,那就往前看看是不是哪里做錯(cuò)了,修改user.sql里面的內(nèi)容,set names latin1;修改為set names utf8;然后另存為utf8的編碼形式。
再使用rz上傳到mysql server上,再次使用vim打開,發(fā)現(xiàn)中文正常顯示,代碼如下:
[root@sh-db1 tmp]# /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql3306.sock -p654321 account < user.sql
登錄mysql查看,中文顯示正常,后來(lái)又總結(jié)出一個(gè)更簡(jiǎn)單辦法.
登陸mysql --->進(jìn)入相應(yīng)數(shù)據(jù)庫(kù)--->代碼如下:
輸入命令:show variables like '%char%';得到:
- +--------------------------+--------------------------+
- | 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 utf8
- | character_set_system utf8
- | character_sets_dir D:MySQLsharecharsets
- +--------------------------+--------------------------+
如果出現(xiàn)上述情況則需要更改數(shù)據(jù)庫(kù)編碼:兩種方法,第一種是一次搞定,第二種只對(duì)當(dāng)前連接有效,斷開連接,恢復(fù)更改前狀態(tài).
方法1:alter database 數(shù)據(jù)庫(kù)名 charset utf8;
方法2:set character_set_database = utf8;
再用命令,代碼如下:
- show variables like '%char%'; --Vevb.com
- +--------------------------+--------------------------+
- | Variable_name | Value |
- +--------------------------+--------------------------+
- | character_set_client utf8
- | character_set_connection utf8
- | character_set_database utf8
- | character_set_filesystem binary
- | character_set_results utf8
- | character_set_server utf8
- | character_set_system utf8
- | character_sets_dir D:MySQLsharecharsets
- +--------------------------+--------------------------+
此時(shí)編碼已經(jīng)一致,但是,對(duì)數(shù)據(jù)庫(kù)中的表進(jìn)行插入中文字符操作,仍然會(huì)報(bào):ERROR 1366 (HY000),代碼如下:
---> set character_set_client = gbk;設(shè)置插入時(shí)接收的編碼為GBK,這樣就可以插入中文了.
此時(shí)中文字符已經(jīng)可以插入,但查詢結(jié)果卻還是亂碼,再更改一處即可:
---> set character_set_results = gbk; 設(shè)置輸出結(jié)果的編碼為GBK
注:這樣的設(shè)置只對(duì)當(dāng)前連接有關(guān),連接斷開,這些設(shè)置恢復(fù)數(shù)據(jù)庫(kù)默認(rèn)設(shè)置狀態(tài),因此,如果需要,每次連接都得設(shè)置.
另外:ERROR 1366 (HY000)錯(cuò)誤主要出現(xiàn)于控制臺(tái)(cmd/黑窗口) 執(zhí)行SQL語(yǔ)句插入中文時(shí)彈出,用mysql-front 軟件插入時(shí)不會(huì)報(bào)字符問(wèn)題,java通過(guò)JDBC連接數(shù)據(jù)庫(kù)執(zhí)行executeUpdate("insert 語(yǔ)句") 中文也能成功插入數(shù)據(jù)且不會(huì)報(bào)錯(cuò).
PHP解決亂碼問(wèn)題只需在連接后加入mysql_query("set names 'gbk'") 就OK,代碼如下:
$conn = mysql_connect("localhost","root",""); mysql_query("set names 'gbk'");
新聞熱點(diǎn)
疑難解答
圖片精選