utf8mb4java
1. Mysql:Unknown character set:utf8mb4怎麼解決
整理 MySQL 8.0 文檔時發現一個變更:
默認字元集由 latin1 變為 utf8mb4。想起以前整理過字元集轉換文檔,升級到 MySQL 8.0 後大概率會有字元集轉換的需求,在此正好分享一下。
當時的需求背景是:
部分系統使用的字元集是 utf8,但 utf8 最多隻能存 3 位元組長度的字元,不能存放 4 位元組的生僻字或者表情符號,因此打鬧搜算遷移到 utf8mb4。
遷移方案一1. 准備新的資料庫實例,修改以下參數:[mysqld]## Character Settingsinit_connect='SET NAMES utf8mb4'#連接建立時執行設置的語句,對super許可權則大用戶無效character-set-server = utf8mb4collation-server = utf8mb4_general_ci#設置服務端校驗規則,如果字元串需要區分大小寫,設置為utf8mb4_binskip-character-set-client-handshake#忽略應用連接自己設置的字元孫彎豎編碼,保持與全局設置一致## Innodb Settingsinnodb_file_format = Barracudainnodb_file_format_max = Barracudainnodb_file_per_table = 1innodb_large_prefix = ON#允許索引的最大位元組數為3072(不開啟則最大為767位元組,對於類似varchar(255)欄位的索引會有問題,因為255*4大於767)
2. 停止應用,觀察,確認不再有數據寫入
可通過 show master status 觀察 GTID 或者 binlog position,沒有變化則沒有寫入。
3. 導出數據
先導出表結構:mysqlmp -u -p --no-data --default-character-set=utf8mb4 --single-transaction --set-gtid-purged=OFF --databases testdb > /backup/testdb.sql
後導出數據:mysqlmp -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. 修改建表語句
修改導出的表結構文件,將表、列定義中的 utf8 改為 utf8mb4
5. 導入數據
先導入表結構:mysql -u -p testdb < /backup/testdb.sql
後導入數據:mysql -u -p testdb < /backup/testdata.sql
6. 建用戶
查出舊環境的資料庫用戶,在新資料庫中創建
7. 修改新資料庫埠,啟動應用進行測試
關閉舊資料庫,修改新資料庫埠重啟,啟動應用
2. java 支持 utf8mb4 嗎
以往mysql里的utf8一個字元最多3位元組,只支持BMP這部分的unicode編碼區,B
3. java如何處理emoji表情,並存入資料庫
這個很簡單呀 你把資料庫或者對應表/欄位的編碼格式從utf8改成utf8mb4就可以存儲emoji表情了,utf8對應的位元組數不夠所以會報錯,mysql8默認的就是utf8mb4,可以了解下
4. java用戶管理的代碼中查詢不了是哪出問題了
是字元集出問題。英文欄位不會出現問題,發生這種情況的很大一個原因是字仿沒符集出問題。只要在你的配置url中設置字元集就好了~在springboot的配置文件加備斗納上,其他框架原理相同銷吵,即在jdbc的url中設置與資料庫相同的字元集,如果資料庫中是UTF8mb4,設置為UTF8即可。
5. MySQL:Unknown character set:utf8mb4怎麼解決
資料庫不支持utf8mb4字元集。 你先汪耐檢查你頁面中使用的編碼是不是utf-8,可能你寫錯了,然後在mysql目錄下的my.ini文件中,把default-character-set全部改成utf8,重新啟動mysql服務。 希望有所幫困孫春助凱橘。
6. java怎麼設置utf8
伺服器端
修改資料庫配置文件/etc/my.cnf
character-set-server=utf8mb4
collation_server=utf8mb4_unicode_ci
重啟MySQL(按照官方文檔,這兩個選項都是可以動態設置的,但是實際的經驗是Server必須重啟一下)
已有的表修改編碼為utf8mb4
ALTER TABLE
tbl_name
CONVERT TO CHARACTER SET
charset_name;
使用下面這個語句只是修改了表的default編碼
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4;
客戶端
jdbc的連接字元串不支持utf8mb4,這個 這種方式 來解決的,如果伺服器端設置了character_set_server=utf8mb4,則客戶端會自動將傳過去的utf-8視作utf8mb4。
Connector/J did not support utf8mb4 for servers 5.5.2 and newer.
Connector/J now auto-detects servers configured with character_set_server=utf8mb4 or treats the Java encoding utf-8 passed using characterEncoding=... as utf8mb4 in the SET NAMES= calls it makes when establishing the connection. (Bug #54175)
其他的client端,比如php、python需要看下client是否支持,如果不能在連接字元串中指定的話,可以在獲取連接之後,執行」set names utf8mb4″來解決這個問題;
因為utf8mb4是utf8的超集,理論上即使client修改字元集為utf8mb4,也會不會對已有的utf8編碼讀取產生任何問題。
