我在讀關於MySQL數據類型的大小。我看到VARCHAR需要額外的1/2字節,MEDIUMTEXT需要額外的3個字節,LONGTEXT需要額外的4個字節。這種MySQL行爲的原因是什麼?
回答
當MySQL(或任何數據庫或計算機語言)存儲可變長度的字符串,基本上有存儲該值的方法有兩種:
- 長度可被編碼,接着由字符在字符串中
- 串的末端可以通過一個特殊的字符進行標記(通常
'0'
)
數據庫(幾乎?)總是使用長度編碼。所以,當你存儲'ABC'
作爲一個可變長度的字符串,在數據庫中存儲它看起來像:
3 A B C
當存儲'A'
:
1 A
這樣,MySQL的知道什麼時候一個字符串結束,接下來開始。不同類型的不同長度取決於字符串的最大長度。因此,1個字節可以保存0到255之間的值。2個字節可以保存0到65,535之間的值,依此類推。
當你使用正則表達式字符,說char(3)
,然後'ABC'
樣子:
A B C
這佔據三個字節/任何(取決於字符編碼)。該長度可以從表元數據中獲知。
隨着char(3)
,串'A'
也佔據三個插槽:
A
---^space here
--------^space here
額外的兩個是通過空間佔用。對於長字符串,這通常是空間的大量浪費,這就是爲什麼大多數字符串存儲爲varchar
而不是char
。
謝謝你的回答,但爲什麼VARCHAR需要一些時間1個字節,有時2個字節,爲什麼CHAR不需要額外的字節? –
@VarunAgw。 。 。閱讀最後一段,瞭解爲什麼'varchar'有時使用一個字節,有時使用2個字符。'char'不需要額外的字節,因爲長度是已知的:字符串中的字符數存儲在數據庫中,長度爲從表格的格式可知。 –
- 1. TCP數據包:這些額外字節的含義是什麼?
- 2. 爲什麼隨機綁定的類型需要額外的StdGen?
- 3. 爲什麼我的CSS需要一些額外無用的代碼來運行
- 4. 爲什麼有些房產要求「強」,有些則不需要?
- 5. 爲什麼一些原語有字節碼,有些則不?
- 6. 正則表達式 - 需要一些字符,並只允許一些額外的?
- 7. 爲什麼需要額外的對象?
- 8. 爲什麼vim中的某些命令需要冒號而有些不需要?
- 9. 爲什麼某些MySQL字段現在需要默認值?
- 10. 爲什麼某些DLL文件需要額外的.lib文件進行鏈接?
- 11. 爲什麼只有一些Tkinter回調函數需要參數,而另一些則不需要
- 12. 設置MySQL架構時,爲什麼要使用某些類型?
- 13. 我需要一些有關dBase字段類型的信息
- 14. 需要一個JavaScript顏色輪與一些額外的功能
- 15. 爲什麼有一些外部JavaScript文件?數字?
- 16. 什麼是Haskell中的一些抽象數據類型,它們與代數數據類型有什麼不同?
- 17. 爲什麼某些組件需要「需要UIExplorerBlock」和「需要UIExplorerPage」?
- 18. 需要模態代碼來執行一些額外的代碼
- 19. 需要有一些方法在我的類來訪問數據
- 20. 爲什麼在庫中需要一些罐子,有些不在戰爭中?
- 21. Ruby on Rails - 爲什麼某些數據需要加密?
- 22. MySql,試圖找出我的一些查詢運行速度有時很慢,需要一些證明爲什麼
- 23. 這些字節是什麼?
- 24. xmlXPathEval需要什麼來成功選擇一些節點?
- 25. 紅寶石:爲什麼我需要一個額外的「A + B」
- 26. 爲什麼它需要一對額外的支架?
- 27. 爲什麼一些OpenGL參數需要0.0-1.0?
- 28. 爲什麼在scala中傳遞一些函數需要_
- 29. 爲什麼實現具有類型約束的泛型接口的泛型類需要重複這些約束?
- 30. 爲什麼有我的列表項之間的一些額外的空間
這個問題似乎是脫離主題,因爲這是其他地方 – Strawberry