Datatypes

當 varchar 更高效時,為什麼數據庫具有 char 數據類型?

  • May 23, 2021

我了解佔用固定長度的數據類型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 用於其他數據庫系統,並且並非所有都支持CHARVARCHAR數據類型(例如,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)中的實現完全相同。使用這些數據類型時速度沒有差異。

引用自:https://dba.stackexchange.com/questions/292076