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