許多開發者在設計文章、日誌、二進位檔案儲存欄位時,容易混淆 TEXT 與 BLOB。本文從儲存本質、字元集、索引、效能等面向詳細比較,助你做正確選型。
| 特性 | TEXT | BLOB |
|---|---|---|
| 儲存內容 | 字元資料(文字) | 二進位資料(圖片、聲音、檔案) |
| 字元集 | 有字元集,依校對規則排序比較 | 無字元集,依位元組數值排序比較 |
| 大小寫轉換 | 儲存/檢索不轉換 | 儲存/檢索不轉換 |
| 尾部空白 | 不刪除 | 不刪除 |
| 預設值 | 不允許 | 不允許 |
| 索引 | 必須指定前綴長度 | 必須指定前綴長度 |
| 排序限制 | 僅用前 max_sort_length (預設 1024) bytes | 同左 |
| 層級 | BLOB | TEXT | 最大長度 |
|---|---|---|---|
| Tiny | TINYBLOB | TINYTEXT | 255 bytes |
| 標準 | BLOB | TEXT | 65,535 bytes (64 KB) |
| Medium | MEDIUMBLOB | MEDIUMTEXT | 16,777,215 bytes (16 MB) |
| Long | LONGBLOB | LONGTEXT | 4,294,967,295 bytes (4 GB) |
兩者各層級最大長度與儲存需求完全相同。
TEXT/BLOBMEDIUMTEXT/MEDIUMBLOBLONGTEXT/LONGBLOBFULLTEXT 索引於 TEXT 欄位。<img> 標籤,所以要用 BLOB。」TEXT。只有將圖片二進位內容直接寫入資料庫才需 BLOB。SELECT * 拉取大欄位;列表頁僅查詢摘要欄位或 SUBSTRING(content, 1, 200)。ALTER TABLE t ADD INDEX idx_content_prefix (content(100)); 僅索引前 100 字元,平衡查詢速度與索引大小。sql_mode=STRICT_TRANS_TABLES 下,超長資料會報錯而非截斷;應用層需驗證長度。max_allowed_packet 限制(預設 4MB/64MB),大檔案需調大此參數並確保客戶端同步設定。TEXT/BLOB 表備份較慢,考慮將大欄位拆分至獨立表(垂直分表)或改用物件儲存(S3、MinIO)僅存 URL。-- 將長文字轉為固定長度物件再排序
SELECT id, SUBSTRING(content, 1, 2000) AS content_prefix
FROM articles
ORDER BY content_prefix;
總結:文字用 TEXT,二進位用 BLOB,依長度選層級,謹慎建立前綴索引,大檔案優先考慮外部儲存。