首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 開發備忘錄:NULL 語義、字符集體系、元數據編碼、連接變量速查

     編輯:MySQL 資料庫相關知識

NULL 與 NOT NULL 陷阱

  • NOT NULL 欄位插入 NULL → MySQL **靜默轉換**為類型預設值 (整數 0、字串 ''、日期 '0000-00-00'),**不報錯**。
  • 可為 NULL 欄位無預設值 → 插入時自動存 NULL。
  • 結論:NOT NULL 非標準約束,僅改變預設值行為。嚴格業務請在應用層驗證。

字符集/校對四層級體系

連接層字符集變量 (關鍵)

character_set_client      -- 客戶端發送 SQL 的編碼
character_set_connection  -- Server 將 client 編碼轉換到此編碼做內部操作
character_set_results     -- Server 返回結果集/錯誤訊息的編碼

設定連接編碼三種方式

-- 方式 1: SET NAMES (最常用)
SET NAMES 'utf8mb4';
-- 等價於
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;

-- 方式 2: SET CHARACTER SET
SET CHARACTER SET 'utf8mb4';
-- 等價於
SET character_set_client = utf8mb4;
SET character_set_results = utf8mb4;
SET collation_connection = @@collation_database;

-- 方式 3: 連接參數 (驅動層自動發送)
-- JDBC: characterEncoding=utf8mb4
-- PHP PDO: charset=utf8mb4
-- Python: charset='utf8mb4'

元數據強制 UTF-8

  • 資料庫名、表名、欄位名、用戶名等**元數據**統一儲存為 **UTF-8** (character_set_system)。
  • 保證 INFORMATION_SCHEMA、SHOW 指令跨語言正常顯示。

常用檢查指令

SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE 'collation%';
SHOW CHARACTER SET;
SHOW COLLATION;
SELECT HEX(col), LENGTH(col), CHAR_LENGTH(col), CHARSET(col), COLLATION(col) FROM tbl;

實戰避坑指南

  1. **建庫建表顯式指定** CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci,不依賴預設。
  2. **連接建立即發送 SET NAMES utf8mb4** (長連接重連後必須重發)。
  3. my.cnf default-character-set **僅影響 mysql 命令列客戶端**,不影響 libmysqlclient 應用。
  4. SQL 函數操作 (如 UPPER()) 在**內部操作字符集**執行,不受連接編碼影響。
  5. 裸字串字面值受 character_set_connection 或 _charset 介紹符影響,比較時需注意。

結語

MySQL 字符集體系「四層級繼承 + 三連接變量 + 元數據固定 UTF-8」。掌握 SET NAMES、CHARSET()、HEX() 排查亂碼核心工具,**顯式配置 > 隱式繼承** 是防亂碼鐵律。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
層級變量說明
Servercharacter_set_server / collation_server實例級預設
Databasecharacter_set_database / collation_database庫級預設 (CREATE DATABASE 繼承 Server)
TableDEFAULT CHARACTER SET / COLLATE表級預設 (繼承 Database)
ColumnCHARACTER SET / COLLATE欄位級 (繼承 Table),最終生效層