首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

輕鬆掌握 MySQL 字符集:層級繼承、隱式轉換與極簡原則

     編輯:MySQL 綜合教學

一、直觀認識字符集層級

mysql> CREATE DATABASE d CHARSET utf8;
mysql> CREATE TABLE d.t (str VARCHAR(10) CHARSET latin1) DEFAULT CHARSET=utf8;

若未顯式指定,MySQL 採用逐層繼承:Server → Database → Table → Column。高層為低層提供默認值,低層可遵可棄。

二、客戶端與服務端通信的字符集轉換

流程:character_set_client → character_set_connection(SQL 處理) → character_set_results(返回結果)。三者可用 SET NAMES 一次性設定。隱式轉換會帶來額外開銷,可用 EXPLAIN EXTENDED + SHOW WARNINGS 檢測。

三、避免隱式轉換的「極簡原則」

  1. 先為 Server/Database 選擇合適字符集。
  2. 依業務讓特定列選擇合適字符集。

四、三個隱含驚喜

1. character_set_database 的趣味行為

當 character_set_database ≠ character_set_server 時,庫的默認字符集由後者決定。無法直接修改 csd,改變 css 即改變 csd。連接實例未指定庫時,默認字符集與 css 相同。

2. LOAD DATA INFILE 最佳實踐

USE db_name;
SET NAMES charset;
-- 開始載入數據

統一字符集,避免「字符集 style」混搭。

3. SELECT INTO OUTFILE 不轉碼

該操作不進行任何字符集轉換,直接按存儲編碼導出。

五、為何不建議「全用 utf8」

  • 浪費空間:CHAR(10) 可能佔 30 字節,即使實際不需要。
  • 索引長度限制:MySQL 假定每字符 3 字節,導致最大索引長度變為 1/3。

結語:根據業務選擇字符集,而非一味追求統一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved