摘要:主要以的或為例,其他數據庫中基本也有類型并需要提供長度的參數。以前的版本的最大長度就是,之后是。而之后表示長度的字節數會變成個。盡管是動態存儲的,但別的數據庫引擎不一定是如此。不管其中每一行存儲的數據是長還是短。
http://dba.stackexchange.com/questions/76469/mysql-varchar-length-and-...
主要以mysql的InnoDB或MyISAM為例,其他數據庫中基本也有varchar類型并需要提供長度的參數。
需要說明的是,例如VARCHAR(3)表示的是這一列最多存3個字符而不是3個字節,比如可以存“一二三”,實際存儲時是編碼為utf-8的。
在mysql中,VARCHAR(3)和VARCHAR(255)在存儲方式上是沒有區別的,都是1個字節表示字符串長度和字符串經utf-8編碼后的字節。mysql5.0.3以前的版本varchar的最大長度就是255,之后是65535。而VARCHAR(256)之后表示長度的字節數會變成2個。其實在今天來說多一個字節也沒什么區別,但為了兼容性,通常的數據庫設計中還是會出現很多VARCHAR(255)。
但事實上,把所有較短的字符串列都設為VARCHAR(255)并不是最好的做法。盡管InnoDB是動態存儲的,但別的數據庫引擎不一定是如此。有的可能會使用固定長度的行,或者固定大小的內存表。內存表即為sql查詢中產生的臨時表。它通常會為varchar類型分配最大的空間,比如utf-8編碼下,內存表可能要為VARCHAR(255)分配2+3×255字節(2是因為存的是字節長度而不是字符長度),如果行數非常多,這也會帶來性能問題。不管其中每一行存儲的數據是長還是短。另外也注意到InnoDB的單列索引每個結點的最大是767字節(即2+3×255)。
InnoDB最大的行的大小是半個database page(大約8000字節),如果可變長的列(如varbinary、varchar、text、blob)超過了這個大小會被存到外面去,行里面只是存一個指針。這會比存inline慢很多。提到這個不得不說一下text類型,text的存儲方法應該和varchar也沒什么區別,就是沒有長度的限制,因此它在有join等產生中間結果的查詢中會非常慢。
所以結論是,我們應該用盡可能小的類型而不是統一用VARCHAR(255)。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/17464.html
摘要:前言在開發過程中,通常會遇到很多一對一數據的處理情況。關于可以看我的另一篇文章多維數組中的。最佳實踐這一次,我們用到了其他兩個函數。勘誤感謝評論區對文章內容錯誤之處的指出。 前言 在開發過程中,通常會遇到很多 一對一 數據的處理情況。而很多時候我們會要取到的是一個列表,然后列表的單條記錄的對應另外一張表,來實現業務。比如下面的商品信息 和 商品詳情 兩個表,這里為了演示只是使用了基礎...
閱讀 2734·2021-09-02 15:11
閱讀 906·2019-08-26 18:18
閱讀 1867·2019-08-26 11:57
閱讀 3317·2019-08-23 16:59
閱讀 1994·2019-08-23 16:51
閱讀 2306·2019-08-23 16:11
閱讀 3120·2019-08-23 14:58
閱讀 1107·2019-08-23 11:34