utf8mb4character_set_server = latin1character_set_server 的啟動時值 作為該過程的「字符集上下文」。SET GLOBAL character_set_server = utf8mb4 **不影響** 已存在的存儲過程。# my.cnf (Linux) / my.ini (Windows)
[mysqld]
# 方案 1:標準參數 (5.7+ 推薦)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 方案 2:兼容舊參數 (5.6 及以下)
default-character-set = utf8mb4
必須重啟 MySQL 服務 使存儲過程捕獲新的啟動值。
-- 1. 確認全域變數
SHOW VARIABLES LIKE 'character_set_server';
-- 應顯示 utf8mb4
-- 2. 重新創建存儲過程 (關鍵!舊過程不會自動更新字符集上下文)
DROP PROCEDURE IF EXISTS sp_test;
CREATE PROCEDURE sp_test(IN p_name VARCHAR(50))
BEGIN
INSERT INTO t_test (name) VALUES (p_name);
END;
-- 3. 測試調用
CALL sp_test('測試中文');
SELECT * FROM t_test; -- 應正常顯示中文
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4' -- 針對非超級用戶連線自動設定
skip-character-set-client-handshake -- 強制忽略客戶端字符集請求,統一用服務端設定
| 誤區 | 正確做法 |
|---|---|
運行時 SET GLOBAL character_set_server = utf8mb4 以為能修好存儲過程 | 只影響新連線的會話變數,存儲過程讀的是啟動值,**必須重啟** |
以為 SET NAMES utf8mb4 在存儲過程內有效 | 存儲過程內無會話上下文,參數編碼已在創建時固化 |
| 只改配置文件不重啟 | 配置文件僅供下次啟動讀取 |
存儲過程參數用 VARCHAR(100) CHARACTER SET utf8mb4 | **語法不支援**,參數不允許指定字符集 |
character_set_server = utf8mb4,問題大幅減少。SET PERSIST character_set_server = utf8mb4 持久化到 mysqld-auto.cnf,重啟自動生效 (但存儲過程仍需重建)。utf8mb4 + utf8mb4_0900_ai_ci (8.0 預設校對)。