今天裝了虛擬Linux主機ubuntu
一、MySQL 字元集(Character Set)基礎
1. 什麼是字元集?
字元集是資料庫用來儲存和處理文字的編碼系統
常見字元集:
latin1:西歐語系
utf8:UTF-8編碼(MySQL中的"utf8"是偽UTF-8,最多只支援3位元組)
utf8mb4:真正的UTF-8(支援4位元組,包含emoji等特殊字元)
big5:繁體中文
gb2312/gbk:簡體中文
2. 校對規則(Collation)
定義字元如何比較和排序
命名規則:字元集_語言_ci/cs/bin
ci:大小寫不敏感
cs:區分大小寫
bin:二進位比較
範例:utf8mb4_unicode_ci、utf8mb4_general_ci
二、字元集相關操作
1. 查看可用字元集與校對規則
SHOW CHARACTER SET;
SHOW COLLATION LIKE 'utf8mb4%';
2. 設定字元集(不同層級)
-- 伺服器層級(通常在my.cnf設定)
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
-- 資料庫層級CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 表格層級
CREATE TABLE mytable (
id INT,
name VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 欄位層級
CREATE TABLE mytable (
id INT,
name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
);
三、資料庫操作與字元集
1. 建立資料庫時指定字元集
CREATE DATABASE mydatabase
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
2. 修改現有資料庫的字元集
ALTER DATABASE mydatabase
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
3. 匯入/匯出資料時的字元集注意事項
-- 匯出時指定字元集mysqldump -u username -p --default-character-set=utf8mb4 mydatabase > backup.sql
-- 匯入時指定字元集mysql -u username -p --default-character-set=utf8mb4 mydatabase < backup.sql
四、常見問題與解決方案
1. 亂碼問題
原因:客戶端、連接層、資料庫層字元集不一致
解決方案:
-- 設定連接字元集SET NAMES 'utf8mb4';
-- 或在連接字串中指定jdbc:mysql://localhost/mydb?useUnicode=true&characterEncoding=utf8
2. emoji儲存問題
原因:utf8只能儲存3位元組字元,emoji需要4位元組
解決方案:使用utf8mb4字元集
3. 效能考量
utf8mb4比utf8佔用更多空間
校對規則影響排序效能:_general_ci比_unicode_ci快
五、最佳實踐建議
統一使用utf8mb4:支援所有Unicode字元,包括emoji
應用層與資料庫層設定一致:避免轉碼開銷
新專案從開始就設定正確字元集:後期修改成本高
備份時注意字元集設定:避免備份/還原時出現亂碼
六、實用查詢
-- 查看當前資料庫的字元集設定SELECT @@character_set_database, @@collation_database;
-- 查看表格的字元集設定SHOW CREATE TABLE mytable;
-- 查看連接相關的字元集變數
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
預習時可以實際操作這些指令,觀察不同設定下的行為差異,這將幫助您更深入理解MySQL的字元集處理機制。
一、MySQL 儲存引擎 (Storage Engines)
1. 常見儲存引擎比較
引擎 | 事務支援 | 鎖粒度 | 主要特點 | 適用場景 |
---|---|---|---|---|
InnoDB | ✓ (ACID) | 行級鎖 | 預設引擎、支援外鍵、崩潰恢復 | 需要事務的OLTP系統 |
MyISAM | ✗ | 表級鎖 | 讀取速度快、全文索引 | 讀多寫少、報表系統 |
MEMORY | ✗ | 表級鎖 | 記憶體儲存、極快存取 | 臨時表、快取數據 |
ARCHIVE | ✗ | 行級鎖 | 高壓縮比、只支援插入查詢 | 歸檔數據、日誌存儲 |
2. 儲存引擎操作指令
-- 查看支援的引擎 SHOW ENGINES; -- 查看表的引擎 SHOW TABLE STATUS LIKE 'table_name'; -- 建立表時指定引擎 CREATE TABLE my_table ( id INT PRIMARY KEY ) ENGINE=InnoDB; -- 修改表的引擎 ALTER TABLE my_table ENGINE=InnoDB;
二、資料型態 (Data Types)
1. 數值型態
型態 | 儲存空間 | 範圍 | 說明 |
---|---|---|---|
TINYINT | 1 byte | -128~127 | 微小整數 |
INT | 4 bytes | ±21億 | 常用整數 |
BIGINT | 8 bytes | ±922京 | 大整數 |
DECIMAL(M,D) | 變動 | 精確小數 | M=總位數, D=小數位 |
2. 字串型態
型態 | 最大長度 | 特點 |
---|---|---|
CHAR(n) | 255字元 | 固定長度,速度快 |
VARCHAR(n) | 65,535字元 | 變動長度,節省空間 |
TEXT | 64KB | 長文字 |
LONGTEXT | 4GB | 超長文字 |
3. 日期時間型態
型態 | 格式 | 範圍 | 儲存空間 |
---|---|---|---|
DATE | YYYY-MM-DD | 1000-01-01~9999-12-31 | 3 bytes |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00~9999-12-31 23:59:59 | 8 bytes |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01~2038-01-19 03:14:07 | 4 bytes |
4. 二進位型態
型態 | 用途 |
---|---|
BLOB | 二進位大物件 |
LONGBLOB | 超大二進位數據 |
三、型態選擇最佳實踐
-
整數選擇原則:
-
根據數據範圍選擇最小夠用的型態
-
自增ID用
UNSIGNED INT
(約42億)或BIGINT
-
-
字串選擇原則:
-
固定長度用
CHAR
(如MD5哈希) -
變動長度用
VARCHAR
-
避免過大長度設定(會影響記憶體分配)
-
-
時間型態選擇:
-
只需要日期用
DATE
-
需要時間用
DATETIME
-
需要自動更新用
TIMESTAMP
-
四、儲存引擎選擇策略
-
InnoDB 使用時機:
-
需要事務處理
-
需要外鍵約束
-
高併發寫入場景
-
-
MyISAM 使用時機:
-
讀密集型應用
-
不需要事務
-
需要全文索引(MySQL 5.6前)
-
-
MEMORY 引擎注意:
-
伺服器重啟後數據消失
-
不支援
TEXT/BLOB
型態
-
五、實用查詢範例
-- 建立包含各種型態的表格 CREATE TABLE sample_data ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(30) NOT NULL, age TINYINT UNSIGNED, balance DECIMAL(10,2) DEFAULT 0.00, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, profile TEXT, avatar BLOB ) ENGINE=InnoDB; -- 查看欄位型態資訊 DESCRIBE sample_data; -- 查詢型態相關系統變數 SHOW VARIABLES LIKE 'storage_engine%';
六、常見問題解決
-
int(11)中的11是什麼意思?
-
只是顯示寬度,不影響儲存範圍
-
實際範圍由型態本身決定
-
-
VARCHAR(255)還是TEXT?
-
VARCHAR(255)會占用額外1字元記錄長度
-
超過255字元建議使用TEXT
-
-
DATETIME vs TIMESTAMP?
-
TIMESTAMP會自動轉換時區
-
DATETIME儲存範圍更大
-
預習時建議實際建立各種型態的表格並插入測試數據,觀察不同型態的儲存行為和限制,這將幫助您更深入理解MySQL的資料型態系統。