摘要:中無法存儲字符,源自于之前編碼只支持最大個字節,而需要個字節。事實上,如果只是某個列存在字符的存儲問題,那就只需要修改這個列的編碼類型即可。這涉及到應用與建立連接的問題。有一條命令是,會將的編碼統一設置。使用這條命令便可以達到我們的目的。
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
摘要:前言最近開發的項目因為需要用戶文本的存儲,自然就遇到了等表情符號如何被支持的問題。問題描述如果字符集且是服務器的話,當存儲含有表情時,會拋出類似如下異常這就是字符集不支持的異常。升級步驟的最低版本支持版本為,若不是,請升級到較新版本。 ? 前言: 最近開發的iOS項目因為需要用戶文本的存儲,自然就遇到了emoji等表情符號如何被mysql DB支持的問題。困擾了數日,在就要絕望放棄...
閱讀 1765·2021-09-22 15:10
閱讀 1261·2021-09-07 09:58
閱讀 2333·2019-08-30 15:44
閱讀 1635·2019-08-26 18:29
閱讀 2033·2019-08-26 13:35
閱讀 759·2019-08-26 13:31
閱讀 720·2019-08-26 11:42
閱讀 1065·2019-08-23 18:39