MySQL8.0:字符集從utf8轉(zhuǎn)換成utf8mb4

整理 MySQL8.0 文檔時(shí)發(fā)現(xiàn)一個(gè)變更:默認(rèn)字符集由 latin1 變?yōu)?utf8mb4。想起以前整理過(guò)字符集轉(zhuǎn)換文檔粘招,升級(jí)到 MySQL8.0 后大概率會(huì)有字符集轉(zhuǎn)換的需求曹质,在此正好分享一下鸳碧。

當(dāng)時(shí)的需求背景是:部分系統(tǒng)使用的字符集是 utf8报强,但 utf8 最多只能存 3 字節(jié)長(zhǎng)度的字符妇穴,不能存放四字節(jié)的生僻字或者表情符號(hào)爬虱,因此打算遷移到 utf8mb4。

遷移方案一

1. 準(zhǔn)備新的數(shù)據(jù)庫(kù)實(shí)例腾它,修改以下參數(shù):

[mysqld]
## Character Settings
init_connect='SET NAMES utf8mb4'
#連接建立時(shí)執(zhí)行設(shè)置的語(yǔ)句跑筝,對(duì)super權(quán)限用戶(hù)無(wú)效
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
#設(shè)置服務(wù)端校驗(yàn)規(guī)則,如果字符串需要區(qū)分大小寫(xiě)瞒滴,設(shè)置為utf8mb4_bin
skip-character-set-client-handshake
#忽略應(yīng)用連接自己設(shè)置的字符編碼曲梗,保持與全局設(shè)置一致
## Innodb Settings
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = ON
#允許索引的最大字節(jié)數(shù)為3072(不開(kāi)啟則最大為767字節(jié),對(duì)于類(lèi)似varchar(255)字段的索引會(huì)有問(wèn)題,因?yàn)?55*4大于767)

2. 停止應(yīng)用稀并,觀察仅颇,確認(rèn)不再有數(shù)據(jù)寫(xiě)入

可通過(guò) show master status 觀察,GTID或者 binlog position 沒(méi)有變化則沒(méi)有寫(xiě)入

3. 導(dǎo)出數(shù)據(jù)

先導(dǎo)出表結(jié)構(gòu):
mysqldump -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql
后導(dǎo)出數(shù)據(jù):
mysqldump -u -p --no-create-info --master-data=2 --flush-logs --routines --events --triggers --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --database testdb > /backup/testdata.sql

4. 修改建表語(yǔ)句

修改導(dǎo)出的表結(jié)構(gòu)文件碘举,將表忘瓦、列定義中的 utf8 改為 utf8mb4

5. 導(dǎo)入數(shù)據(jù)

先導(dǎo)入表結(jié)構(gòu):
mysql -u -p testdb < /backup/testdb.sql
后導(dǎo)入數(shù)據(jù):
mysql -u -p testdb < /backup/testdata.sql

6. 建用戶(hù)

查出舊環(huán)境的數(shù)據(jù)庫(kù)用戶(hù),在新數(shù)據(jù)庫(kù)中創(chuàng)建

7. 修改新數(shù)據(jù)庫(kù)端口引颈,啟動(dòng)應(yīng)用進(jìn)行測(cè)試

關(guān)閉舊數(shù)據(jù)庫(kù)耕皮,修改新數(shù)據(jù)庫(kù)端口重啟,啟動(dòng)應(yīng)用

遷移方案二

1. 修改表的字符編碼會(huì)鎖表蝙场,建議先停止應(yīng)用
2. 停止mysql凌停,備份數(shù)據(jù)目錄(也可以其他方式進(jìn)行全備)
3. 修改配置文件,重啟數(shù)據(jù)庫(kù)

[mysqld]

## Character Settings
init_connect='SET NAMES utf8mb4'
#連接建立時(shí)執(zhí)行設(shè)置的語(yǔ)句售滤,對(duì)super權(quán)限用戶(hù)無(wú)效
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
#設(shè)置服務(wù)端校驗(yàn)規(guī)則罚拟,如果字符串需要區(qū)分大小寫(xiě),設(shè)置為utf8mb4_bin
skip-character-set-client-handshake
#忽略應(yīng)用連接自己設(shè)置的字符編碼完箩,保持與全局設(shè)置一致
## Innodb Settings
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_file_per_table = 1
innodb_large_prefix = ON
#允許索引的最大字節(jié)數(shù)為3072(不開(kāi)啟則最大為767字節(jié)赐俗,對(duì)于類(lèi)似varchar(255)字段的索引會(huì)有問(wèn)題,因?yàn)?55*4大于767)

4. 查看所有表結(jié)構(gòu)弊知,包括字段阻逮,修改庫(kù)和表結(jié)構(gòu),如果字段有定義字符編碼秩彤,也需要修改字段屬性叔扼,sql語(yǔ)句如下:

修改表的字符集,會(huì)同時(shí)將字段的字符編碼修改:
alter table t convert to character set utf8mb4;
影響:拷貝全表漫雷,速度慢瓜富,會(huì)加鎖,阻塞寫(xiě)操作

修改database的默認(rèn)字符集珊拼,之后新建表默認(rèn)即使用這個(gè)字符編碼:
alter database sbtest CHARACTER SET utf8mb4;
影響:只需修改元數(shù)據(jù)食呻,速度很快

5. 修改JDBC url characterEncoding=utf-8
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澎现,隨后出現(xiàn)的幾起案子牡整,更是在濱河造成了極大的恐慌短条,老刑警劉巖塔淤,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件流礁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡妹蔽,警方通過(guò)查閱死者的電腦和手機(jī)椎眯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)挠将,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人编整,你說(shuō)我怎么就攤上這事舔稀。” “怎么了掌测?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵内贮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我汞斧,道長(zhǎng)夜郁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任粘勒,我火速辦了婚禮竞端,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庙睡。我一直安慰自己事富,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布埃撵。 她就那樣靜靜地躺著赵颅,像睡著了一般虽另。 火紅的嫁衣襯著肌膚如雪暂刘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,784評(píng)論 1 290
  • 那天捂刺,我揣著相機(jī)與錄音谣拣,去河邊找鬼。 笑死族展,一個(gè)胖子當(dāng)著我的面吹牛森缠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播仪缸,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼贵涵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了恰画?” 一聲冷哼從身側(cè)響起宾茂,我...
    開(kāi)封第一講書(shū)人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拴还,沒(méi)想到半個(gè)月后跨晴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡片林,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年端盆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怀骤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡焕妙,死狀恐怖蒋伦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焚鹊,我是刑警寧澤凉敲,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站寺旺,受9級(jí)特大地震影響爷抓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阻塑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一蓝撇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陈莽,春花似錦渤昌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至私植,卻和暖如春忌栅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背曲稼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工索绪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贫悄。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓瑞驱,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親窄坦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唤反,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容