本文目錄一覽:
如何在mysql中存取utf8mb4編碼的字符
utf8編碼可以支持一到4位元組的字符編碼,在mysql用我們一般使用utf8編碼來處理字符類型,通常情況下都沒有問題,但遇到4位元組編碼的字符,在數據存取的時候就會有問題了。
通常我們可能會得到一個錯誤或者警告:Incorrect
string
value:
‘\xF0\x9D\x8C\x86’
for
column
…
Mysql
從5.5.3版本開始支持4位元組的utf8編碼,如果你的Mysql數據庫是5.5.3+,按照以下步驟就能解決這個問題,如果版本低於5.5.3,是不是可以考慮升級數據庫版本呢?
1、在修改數據庫編碼前先對數據庫備份(雖然utf8mb4兼容utf8,但有備無患)
2、修改數據庫的編碼、表的編碼、列的編碼為utf8mb4
3、在Mysql數據庫配置文件(my.ini)中加入如下設置
[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數據庫,確認設置生效
mysql
show
VARIABLES
like
‘%char%’;
+————————–+—————————————-+
|
Variable_name
|
Value
|
+————————–+—————————————-+
|
character_set_client
|
utf8
|
|
character_set_connection
|
utf8
|
|
character_set_database
|
utf8mb4
|
|
character_set_filesystem
|
binary
|
|
character_set_results
|
utf8
|
|
character_set_server
|
utf8mb4
|
|
character_set_system
|
utf8
|
|
character_sets_dir
|
/home/app/mysql-5.5.33/share/charsets/
|
+————————–+—————————————-+
8
rows
in
set
4、在獲取數據庫連接的時候執行sql:set
names
utf8mb4;我使用的是alibaba的開源數據庫連接池程序,在配置文件中增加一行如下配置
property
name=”connectionInitSqls”
value=”set
names
utf8mb4;”
/
重新啟動應用程序,問題解決,轉載,僅供參考。
mysql 5.7怎麼設置成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. 導出數據
先導出表結構:mysqldump -u -p –no-data –default-character-set=utf8mb4 –single-transaction –set-gtid-purged=OFF –databases testdb /backup/testdb.sql
後導出數據: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. 修改建表語句
修改導出的表結構文件,將表、列定義中的 utf8 改為 utf8mb4
5. 導入數據
先導入表結構:mysql -u -p testdb /backup/testdb.sql
後導入數據:mysql -u -p testdb /backup/testdata.sql
6. 建用戶
查出舊環境的數據庫用戶,在新數據庫中創建
7. 修改新數據庫端口,啟動應用進行測試
關閉舊數據庫,修改新數據庫端口重啟,啟動應用
如何mysql 5.7的編碼設置成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. 導出數據
先導出表結構:mysqldump -u -p –no-data –default-character-set=utf8mb4 –single-transaction –set-gtid-purged=OFF –databases testdb /backup/testdb.sql
後導出數據: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. 修改建表語句
修改導出的表結構文件,將表、列定義中的 utf8 改為 utf8mb4
5. 導入數據
先導入表結構:mysql -u -p testdb /backup/testdb.sql
後導入數據:mysql -u -p testdb /backup/testdata.sql
6. 建用戶
查出舊環境的數據庫用戶,在新數據庫中創建
7. 修改新數據庫端口,啟動應用進行測試
關閉舊數據庫,修改新數據庫端口重啟,啟動應用
原創文章,作者:O17QK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/128670.html