首頁 > 軟體

MySql儲存表情報錯的排查解決

2022-07-08 14:08:43

前言 

  • 作業系統:linux
  • 資料庫版本: 8.0.27
  • 檢視版本命令:mysql -uroot -p 登入成功後就可以看到

問題

個人部落格markdown插入標籤後報以下錯誤

報錯資訊:Incorrect string value: '\xF0\x9F\x98\x82' for column 'content' at row 1

在網上查詢得知:在用mysql進行表情符號儲存時,會報錯,這是由於Emoji表情是4個位元組,而mysql的utf-8編碼最多是3個位元組,所以在進行表情符號插入的時候會插入不進去。那麼此時應該通過修改mysql編碼為utf8mb4來解決該問題。

但是我在sql表建立時已經想到了這一點並且相關欄位也是utf8mb4,為什麼還會報錯

排查解決

通過多方查詢和嘗試,發現只要修改mysql設定資訊就可以解決問題

1.在linux下找到mysql的組態檔my.cnf (window為my.ini),如果找不到可以直接查詢

$ find / -name my.cnf

2.在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
init_connect='SET NAMES utf8mb4'

3.重啟mysql服務

$ service mysqld restart

mysql變數設定擴充套件

1.character_set_client主要用來設定使用者端使用的字元集。

2.character_set_connection主要用來設定連線資料庫時的字元集,如果程式中沒有指明連線資料庫使用的字元集型別則按照這個字元集設定。

3.character_set_database主要用來設定預設建立資料庫的編碼格式,如果在建立資料庫時沒有設定編碼格式,就按照這個格式設定。

4.character_set_filesystem檔案系統的編碼格式,把作業系統上的檔名轉化成此字元集,即把 character_set_client轉換character_set_filesystem, 預設binary是不做任何轉換的。

5.character_set_results資料庫給使用者端返回時使用的編碼格式,如果沒有指明,使用伺服器預設的編碼格式。

6.character_set_server伺服器安裝時指定的預設編碼格式,這個變數建議由系統自己管理,不要人為定義。

7.character_set_system資料庫系統使用的編碼格式,這個值一直是utf8,不需要設定,它是為儲存系統後設資料的編碼格式。

8.character_sets_dir這個變數是字元集安裝的目錄。

補充

在實際開發中,我們應該提前約定好字元集,而不是後面隨意更改,隨意更改可能會影響到原有資料顯示問題;可以更改mysql預設設定,將其設為utf8mb4具體操作如下:

1、修改mysql組態檔(windows:my.ini;linux:my.cnf)

[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
#character-set-server=utf8 這行註釋掉
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect = 'SET NAMES utf8mb4'

2、重啟mysql

service mysql restart

3、檢視是否修改成功

SHOW VARIABLES WHERE Variable_name LIKE 'character%' OR Variable_name LIKE 'collation%';

下圖紅框內為utf8mb4資訊即為修改成功

總結

到此這篇關於MySql儲存表情報錯排查解決的文章就介紹到這了,更多相關MySql儲存表情報錯內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com