![MySQL TEXT 欄位的儲存需求](https://rvso.com/image/1366212/MySQL%20TEXT%20%E6%AC%84%E4%BD%8D%E7%9A%84%E5%84%B2%E5%AD%98%E9%9C%80%E6%B1%82.png)
我有一個名為「使用 MyISAM 儲存引擎」的 MySQL 表,errormsg2
其中包含大約十幾個欄位。
我估計其中兩列佔據了每行使用的大部分空間,並且它們的資料類型為 TEXT。他們是backtrace
和msg
。
我試圖估計每行所需的儲存量,但發現了以下矛盾:
show table status where name = 'errormsg2';
顯示(data_length + index_length) / rows
每行大約 778 位元組。
select avg( bit_length( em.backtrace ) + bit_length( em.msg ) ) / 8 from errormsg2 em;
僅顯示這兩列中每行平均 899 位元組的文字。
表儲存的資料怎麼可能比它使用的資料多?我缺什麼?
答案1
需要考慮的一件事是編碼問題。例如,UTF-8 對某些字元使用 5 個位元組。如果沒有數據或變數數據,資料庫將被迫假設最壞的情況:每個字元的長度可能是 5 個位元組。因此,它可能會分配比實際需要使用的更多的資源。
請注意,UTF-16 雖然據稱只有 2 個位元組,但也可能遇到相同類型的問題:它必須對 4 個位元組長的代理項對進行編碼。 UTF-16 還有多個其他問題,並且一些提倡始終使用 UTF-8