国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Application無法傳遞Emoji字符到MySQL的問題

dmlllll / 2560人閱讀

摘要:中無法存儲字符,源自于之前編碼只支持最大個字節,而需要個字節。事實上,如果只是某個列存在字符的存儲問題,那就只需要修改這個列的編碼類型即可。這涉及到應用與建立連接的問題。有一條命令是,會將的編碼統一設置。使用這條命令便可以達到我們的目的。

MySQL中無法存儲Emoji字符,源自于MySQL 5.5之前utf8編碼只支持最大3個字節,而Emoji需要4個字節。從MySQL 5.5開始,其utf8編碼開始有了支持4個字節的utf8類型:utf8mb4 .

通常,如果你的MySQL版本是5.5+但又無法在某個具體的列存儲Emoji字符,就是源自于這個列的類型還停留于過去的utf8類型,沒有升級到最新的支持4字節的utf8mb4.

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

網上的大部分資料采用了更改 "列、表、庫" 的編碼類型,再配上修改MySQL配置文件,并重啟MySQL的方式來解決問題:

-- 修改一列:
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;

-- 修改庫:
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的重啟,對生產環境來講,重啟db是一件代價極其高昂的事情。

事實上,如果只是某個列存在Emoji字符的存儲問題,那就只需要修改這個列的編碼類型即可。如果確實需要修改到"表、庫"這個級別,那再做修改不遲。

做完這一步后,應該可以在db客戶端直接存儲Emoji字符了。但是,對于需要連接到MySQL的應用來講,僅僅上述步驟的修改還不夠,還無法使應用將Emoji字符成功地存儲MySQL。這涉及到應用與MySQL建立連接的問題。

由于我們想要不重啟MySQL,那么MySQL當中默認給出的 "建立新連接" (set connection) 所支持的字符編碼依舊是utf8。雖然db里面的某個特定的列已經支持了utf8mb4,但"連接"不支持對utf8mb4字符的傳輸,Emoji字符也就無法順利運輸到db中。

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

有一條MySQL命令是 set names "xxx" ,會將character_set_client、character_set_connection、character_set_results的編碼統一設置。使用這條命令 set names utf8mb4; 便可以達到我們的目的。

但問題是,應該在哪里設置這條命令呢?很多人會直接在自己的MySQL客戶端運行這條命令,但發現自己的應用依舊無法正確傳遞Emoji字符。這是因為,當你在MySQL客戶端運行這條命令時,只是設置了你的客戶端同MySQL的connection字符編碼,但你的應用卻使用了自己的connection,當然無法達到目的。

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

而如果你使用的是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來配置bean,則只需要:


  
  
  
  
  
  
  

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73855.html

相關文章

  • mysql/Java服務端對emoji支持

    摘要:前言最近開發的項目因為需要用戶文本的存儲,自然就遇到了等表情符號如何被支持的問題。問題描述如果字符集且是服務器的話,當存儲含有表情時,會拋出類似如下異常這就是字符集不支持的異常。升級步驟的最低版本支持版本為,若不是,請升級到較新版本。 ? 前言: 最近開發的iOS項目因為需要用戶文本的存儲,自然就遇到了emoji等表情符號如何被mysql DB支持的問題。困擾了數日,在就要絕望放棄...

    lncwwn 評論0 收藏0

發表評論

0條評論

dmlllll

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<