溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql 字符集亂碼探究

發(fā)布時(shí)間:2020-08-09 12:31:02 來(lái)源:ITPUB博客 閱讀:119 作者:dbasdk 欄目:MySQL數(shù)據(jù)庫(kù)
環(huán)境描述:青云的mysql實(shí)例的ip為:192.168.0.254,和青云的跳板主機(jī),我們?cè)谔逯鳈C(jī)上安裝了mysql服務(wù),并通過(guò)下面方式連接mysql:
[root@i-iivphroy ~]# mysql -uroot -p********* -h292.168.0.254
問(wèn)題描述:近期網(wǎng)站整體遷云,需要先遷移一部分?jǐn)?shù)據(jù)到云,采用mysqldump的方法,可是在云上source完成之后,卻發(fā)現(xiàn)中文亂碼。
一:查看源端mysql的相關(guān)信息。
1:查看源端mysql的表的字符集,為utf8.
mysql> show create table v_publish_info;
。
。
。
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
2:查看mysql關(guān)于字符集的參數(shù),
MariaDB [log]> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)
MariaDB [log]> show variables like 'character_set_%';
+--------------------------+------------------------+
| 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 | /mysql/share/charsets/ |
二:查看目標(biāo)云端的相關(guān)信息
1,查看目標(biāo)端mysql的表的字符集,為utf8.
mysql> show create table v_publish_info;
。
。
。
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
2,查看mysql關(guān)于字符集的參數(shù),發(fā)現(xiàn)是latin1
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | latin1 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
mysql> show variables like 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_general_ci |
| collation_server | latin1_general_ci |
+----------------------+-------------------+
3 rows in set (0.01 sec)
原來(lái)是青云的mysql默認(rèn)的字符集相關(guān)參數(shù)是latin1,但是我們的表是utf8,這導(dǎo)致亂碼,驗(yàn)證:
在云端修改參數(shù),都改成utf8,也就是改成和源端一樣,
mysql> set character_set_client=utf8 ;
mysql> set character_set_connection =utf8 ;
。
。
mysql> set collation_server =utf8_general_ci ;
再次查看數(shù)據(jù),中文不再亂碼:
mysql> select title from v_publish_info limit 2;
+-----------------------------------------------------------------------------------------------------------------+
| title |
+-----------------------------------------------------------------------------------------------------------------+
| 即墨省級(jí)經(jīng)濟(jì)開(kāi)發(fā)區(qū)藍(lán)色新區(qū)管理委員會(huì)關(guān)于體育中心銅鋁復(fù)合散熱器邀請(qǐng)報(bào)價(jià)的函 |
| 2015年招投標(biāo)領(lǐng)域十大關(guān)鍵詞 |
+-----------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
既然確定了就是這些參數(shù)導(dǎo)致的問(wèn)題,那么接下來(lái)開(kāi)始解決問(wèn)題,前面修改的參數(shù),僅僅是在當(dāng)前會(huì)話生效的,新開(kāi)session無(wú)效,于是通過(guò)控制臺(tái)修改mysql的參數(shù),
character_set_server=utf8
然后重啟mysql實(shí)例,然后再次查看mysql的數(shù)據(jù),發(fā)現(xiàn)依舊亂碼,
mysql> select title from v_publish_info limit 2;
+---------------------------------------+
| title |
+---------------------------------------+
| ????????????????????????????????????? |
| 2015??????????? |
+---------------------------------------+
2 rows in set (0.00 sec)
再次查看相關(guān)參數(shù):發(fā)現(xiàn)還有 latin1
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| 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)
mysql> 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)
我們已經(jīng)把mysql服務(wù)端的相關(guān)參數(shù)修改了,剩下的是clint端的參數(shù),我們是通過(guò)下面方式連接數(shù)據(jù)庫(kù)的,也就是說(shuō)mysql并沒(méi)有在這臺(tái)服務(wù)器上,而是在192.168.0.254上面的。
[root@i-iivphroy ~]# mysql -uroot -p********* -h292.168.0.254
突然想到那這臺(tái)跳板機(jī)就相當(dāng)于是客戶端了,這里面也有my.cnf的配置文件,嘗試去修改這里,如下紅色部分,是設(shè)置客戶端的參數(shù)的:
[root@i-iivphroy ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#[mysqld]
#default-character-set=utf8
#init_connect = 'SET NAMES utf8'
[client]
default-character-set=utf8
然后從新登錄數(shù)據(jù)庫(kù):
[root@i-iivphroy ~]# mysql -uroot -p********* -h292.168.0.254
再次查看相關(guān)參數(shù),徹底和源端一樣了:
mysql> show variables like 'collation_%';
+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.01 sec)
mysql> show variables like 'character_set_%';
+--------------------------+----------------------------+
| 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/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
再次查看數(shù)據(jù),不在亂碼:
mysql> select title from v_publish_info limit 2;
+-----------------------------------------------------------------------------------------------------------------+
| title |
+-----------------------------------------------------------------------------------------------------------------+
| 即墨省級(jí)經(jīng)濟(jì)開(kāi)發(fā)區(qū)藍(lán)色新區(qū)管理委員會(huì)關(guān)于體育中心銅鋁復(fù)合散熱器邀請(qǐng)報(bào)價(jià)的函 |
| 2015年招投標(biāo)領(lǐng)域十大關(guān)鍵詞 |
+-----------------------------------------------------------------------------------------------------------------+
下面講解下這幾個(gè)參數(shù)
系統(tǒng)變量:
– character_set_server:默認(rèn)的內(nèi)部操作字符集
– character_set_client:客戶端來(lái)源數(shù)據(jù)使用的字符集
– character_set_connection:連接層字符集
– character_set_results:查詢結(jié)果字符集
– character_set_database:當(dāng)前選中數(shù)據(jù)庫(kù)的默認(rèn)字符集
– character_set_system:系統(tǒng)元數(shù)據(jù)(字段名等)字符集
– 還有以collation_開(kāi)頭的同上面對(duì)應(yīng)的變量,用來(lái)描述字符序。
1.庫(kù)、表、列字符集的由來(lái):
(1).建庫(kù)時(shí),若未明確指定字符集,則采用character_set_server指定的字符集。
(2).建表時(shí),若未明確指定字符集,則采用當(dāng)前庫(kù)所采用的字符集。
(3).新增,修改表字段時(shí),若未明確指定字符集,則采用當(dāng)前表所采用的字符集。
2.更新、查詢涉及到得字符集變量:
用戶在更新(插入,刪除,修改),查詢數(shù)據(jù)庫(kù)時(shí),最常使用的字符集變量主要包含:character_set_client,character_set_connection,character_set_result。
(1)更新流程字符集轉(zhuǎn)換過(guò)程:character_set_client------->character_set_connection----->表字符集。
(2)查詢流程字符集轉(zhuǎn)換過(guò)程:表字符集------->character_set_result
總結(jié):通過(guò)這次解決問(wèn)題的過(guò)程,修正了我原來(lái)的認(rèn)識(shí),原來(lái)數(shù)據(jù)庫(kù)的參數(shù),可以通過(guò)修改客戶端(數(shù)據(jù)庫(kù)沒(méi)在這個(gè)服務(wù)器上)的配置文件my.cnf來(lái)改變,并且了解到了查詢一條數(shù)據(jù),需要把表的字符集轉(zhuǎn)換成character_set_result的字符集,亂碼你就修改這個(gè)character_set_result參數(shù)即可。并且mysql數(shù)據(jù)庫(kù)的my.cnf最好設(shè)置上如下兩個(gè)參數(shù):
[mysqld]
default-character-set=utf8
[client]
default-character-set=utf8
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI