當 varchar 更高效時,為什麼數據庫具有 char 數據類型?
我了解佔用固定長度的數據類型
CHAR
和占用空間的數據類型之間的基本區別是基於儲存的內容。VARCHAR``CHAR``VARCHAR
但是,如果
VARCHAR
根據儲存的內容動態處理空間管理如此有效,為什麼數據庫支持CHAR
數據類型,所有CHAR(n)
欄位都可以是VARCHAR(n)
欄位,對吧?
您應該閱讀這篇文章SQL varchar data type deep dive,特別是使用 SQL varchar 的儲存和性能注意事項部分:
由於欄位長度固定,直接從列中提取數據而不進行任何數據操作,並且針對 varchar 的索引查找比 char 欄位慢。CHAR 在性能方面優於 VARCHAR,但是,當數據沒有固定長度時,它會佔用不必要的記憶體空間。因此,在磁碟大小不是問題的情況下,建議使用 CHAR。
請注意,這特別說明了從 Microsoft SQL Server 角度來看的差異,YMMV 用於其他數據庫系統,並且並非所有都支持
CHAR
和VARCHAR
數據類型(例如,SQLite 既沒有數據類型,也只支持它所稱的TEXT
數據類型)。從 MySQL 的角度來看,這裡有一些很好的資訊,由 RolandoMySQLDBA 提供 - DBA.StackExchange 回答What is the performance impact of using CHAR vs VARCHAR on a fixed-size field?:
由於 CHAR 欄位由於欄位寬度固定而需要較少的字元串操作,因此針對 CHAR 欄位的索引查找平均比 VARCHAR 欄位快 20%。
令人驚訝的是,在 PostgreSQL 領域,聽起來似乎不存在相同的性能差異,因此數據類型之間的實際差異並不那麼豐富。請參閱StackOverflow 對文本和 varchar 之間的差異(字元變化)的回答以及對 CHAR vs VARCHAR (Postgres)的索引性能的 DBA.StackExchange 回答:
…所有 4 種數據類型的插入和選擇的性能相似。
CHAR 和 VARCHAR 在 Postgres(和 Oracle)中的實現完全相同。使用這些數據類型時速度沒有差異。