成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Application無(wú)法傳遞Emoji字符到MySQL的問(wèn)題

dmlllll / 2578人閱讀

摘要:中無(wú)法存儲(chǔ)字符,源自于之前編碼只支持最大個(gè)字節(jié),而需要個(gè)字節(jié)。事實(shí)上,如果只是某個(gè)列存在字符的存儲(chǔ)問(wèn)題,那就只需要修改這個(gè)列的編碼類(lèi)型即可。這涉及到應(yīng)用與建立連接的問(wèn)題。有一條命令是,會(huì)將的編碼統(tǒng)一設(shè)置。使用這條命令便可以達(dá)到我們的目的。

MySQL中無(wú)法存儲(chǔ)Emoji字符,源自于MySQL 5.5之前utf8編碼只支持最大3個(gè)字節(jié),而Emoji需要4個(gè)字節(jié)。從MySQL 5.5開(kāi)始,其utf8編碼開(kāi)始有了支持4個(gè)字節(jié)的utf8類(lèi)型:utf8mb4 .

通常,如果你的MySQL版本是5.5+但又無(wú)法在某個(gè)具體的列存儲(chǔ)Emoji字符,就是源自于這個(gè)列的類(lèi)型還停留于過(guò)去的utf8類(lèi)型,沒(méi)有升級(jí)到最新的支持4字節(jié)的utf8mb4.

解決方案的思路也很簡(jiǎn)單,就是在確保你的MySQL是5.5+的前提下,將需要存儲(chǔ)Emoji字符的列的編碼改為utf8mb4.

網(wǎng)上的大部分資料采用了更改 "列、表、庫(kù)" 的編碼類(lèi)型,再配上修改MySQL配置文件,并重啟MySQL的方式來(lái)解決問(wèn)題:

-- 修改一列:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改表:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 修改庫(kù):
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

-- ==============================

-- 修改配置文件 /etc/my.cnf
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

這樣的解決方案有些粗糙,并涉及到MySQL的重啟,對(duì)生產(chǎn)環(huán)境來(lái)講,重啟db是一件代價(jià)極其高昂的事情。

事實(shí)上,如果只是某個(gè)列存在Emoji字符的存儲(chǔ)問(wèn)題,那就只需要修改這個(gè)列的編碼類(lèi)型即可。如果確實(shí)需要修改到"表、庫(kù)"這個(gè)級(jí)別,那再做修改不遲。

做完這一步后,應(yīng)該可以在db客戶(hù)端直接存儲(chǔ)Emoji字符了。但是,對(duì)于需要連接到MySQL的應(yīng)用來(lái)講,僅僅上述步驟的修改還不夠,還無(wú)法使應(yīng)用將Emoji字符成功地存儲(chǔ)MySQL。這涉及到應(yīng)用與MySQL建立連接的問(wèn)題。

由于我們想要不重啟MySQL,那么MySQL當(dāng)中默認(rèn)給出的 "建立新連接" (set connection) 所支持的字符編碼依舊是utf8。雖然db里面的某個(gè)特定的列已經(jīng)支持了utf8mb4,但"連接"不支持對(duì)utf8mb4字符的傳輸,Emoji字符也就無(wú)法順利運(yùn)輸?shù)絛b中。

所以問(wèn)題就變成了,如何在不重啟MySQL的前提下,重新設(shè)置connection的字符編碼。

有一條MySQL命令是 set names "xxx" ,會(huì)將character_set_client、character_set_connection、character_set_results的編碼統(tǒng)一設(shè)置。使用這條命令 set names utf8mb4; 便可以達(dá)到我們的目的。

但問(wèn)題是,應(yīng)該在哪里設(shè)置這條命令呢?很多人會(huì)直接在自己的MySQL客戶(hù)端運(yùn)行這條命令,但發(fā)現(xiàn)自己的應(yīng)用依舊無(wú)法正確傳遞Emoji字符。這是因?yàn)?,?dāng)你在MySQL客戶(hù)端運(yùn)行這條命令時(shí),只是設(shè)置了你的客戶(hù)端同MySQL的connection字符編碼,但你的應(yīng)用卻使用了自己的connection,當(dāng)然無(wú)法達(dá)到目的。

所以正確的做法是,你需要在自己應(yīng)用建立connection后,在代碼中運(yùn)行這條命令。

而如果你使用的是Druid DataSource(如果你使用的是Tomcat DataSource,那么你可以大膽切換到Druid DataSource),那么這件事情就更容易了,只需要在配置文件的 connectionInitSqls 中完成這件事。以Java為例,你只需要:

DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl(url);
dataSource.setUsername(userName);
dataSource.setPassword(password);

// set "utf8mb4" to support emoji character
dataSource.setConnectionInitSqls(Arrays.asList("set names utf8mb4;"));

如果你使用的是xml來(lái)配置bean,則只需要:


  
  
  
  
  
  
  

如此,便能在不重啟MySQL的情況下讓你應(yīng)用將Emoji字符傳遞到db中去。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73855.html

相關(guān)文章

  • mysql/Java服務(wù)端對(duì)emoji支持

    摘要:前言最近開(kāi)發(fā)的項(xiàng)目因?yàn)樾枰脩?hù)文本的存儲(chǔ),自然就遇到了等表情符號(hào)如何被支持的問(wèn)題。問(wèn)題描述如果字符集且是服務(wù)器的話(huà),當(dāng)存儲(chǔ)含有表情時(shí),會(huì)拋出類(lèi)似如下異常這就是字符集不支持的異常。升級(jí)步驟的最低版本支持版本為,若不是,請(qǐng)升級(jí)到較新版本。 ? 前言: 最近開(kāi)發(fā)的iOS項(xiàng)目因?yàn)樾枰脩?hù)文本的存儲(chǔ),自然就遇到了emoji等表情符號(hào)如何被mysql DB支持的問(wèn)題。困擾了數(shù)日,在就要絕望放棄...

    lncwwn 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<