最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL數據類型varchar詳解

 更新時間:2014年03月17日 11:10:11   作者:  
這篇文章詳細介紹了MySQL數據類型varchar,探討varchar到底能存多長的數據、InnoDB和MyISAM中的varchar等問題,需要的朋友可以參考下
1、varchar(N)的邏輯意義
從MySQL4.1開始,varchar (N)中的N指的是該字段最多能存儲多少個字符(characters),不是字節(jié)數。
不管是一個中英文字符或者數字、或者一個漢字,都當做一個字符。在4.1之前,N表示的是最大存儲的字節(jié)數(bytes)。
2、varchar(N)到底能存多長的數據
在mysql reference manual上,varchar最多能存儲65535個字節(jié)的數據。varchar 的最大長度受限于最大行長度(max row size,65535bytes)。65535并不是一個很精確的上限,可以繼續(xù)縮小這個上限。65535個字節(jié)包括所有字段的長度,變長字段的長度標識(每個變長字段額外使用1或者2個字節(jié)記錄實際數據長度)、NULL標識位的累計。
NULL標識位,如果varchar字段定義中帶有default null允許列空,則需要需要1bit來標識,每8個bits的標識組成一個字段。一張表中存在N個varchar字段,那么需要(N+7)/8 (取整)bytes存儲所有的NULL標識位。
如果數據表只有一個varchar字段且該字段DEFAULT NULL,那么該varchar字段的最大長度為65532個字節(jié),即65535-2-1=65532 bytes。
復制代碼 代碼如下:
CREATE TABLE `vchar1` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `vchar2` (   `name` VARCHAR(65533)  NOT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

如果數據表只有一個varchar字段且該字段NOT NULL,那么該varchar字段的最大長度為65533個字節(jié),即65535-2=65533bytes。
復制代碼 代碼如下:
CREATE TABLE `vchar3` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `vchar4` (   `name` VARCHAR(65532)  DEFAULT  NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

來個略微復雜點的表結構,->
復制代碼 代碼如下:
CREATE TABLE `tv` (
`a` VARCHAR(100) DEFAULT NULL,
`b` VARCHAR(100) DEFAULT NULL,
`c` VARCHAR(100) DEFAULT NULL,
`d` VARCHAR(100) DEFAULT NULL,
`e` VARCHAR(100) DEFAULT NULL,
`f` VARCHAR(100) DEFAULT NULL,
`g` VARCHAR(100) DEFAULT NULL,
`h` VARCHAR(100) DEFAULT NULL,
`i` VARCHAR(N) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1

`i` varchar(N) DEFAULT NULL中N最大值可以為多少?
這樣計算:已知確定的字段長度為100*8  bytes,8個varchar(100)字段總共需要變長字段表示字節(jié)為1*8=8 bytes。每個NULL字段用1bit標識,9個字段都是default null,那么需要用(9+7)/8bit = 2 bytes存儲NULL標識位。65535-100*8-1*8-2 = 64725 > 256, 那么字段i的最大長度為64725  - 2 =64723 bytes,即N=64723 。
varchar到底能存多少個字符?這與使用的字符集相關,latin1、gbk、utf8編碼存放一個字符分別需要占1、2、3個字節(jié)。
3、varchar物理存儲
在物理存儲上,varchar使用1到2個額外的字節(jié)表示實際存儲的字符串長度(bytes)。如果列的最大長度小于256個字節(jié),用一個字節(jié)表示(標識)。如果最大長度大于等于256,使用兩個字節(jié)。
當選擇的字符集為latin1,一個字符占用一個byte
varchar(255)存儲一個字符,一共使用2個bytes物理空間存儲數據實際數據長度和數據值。
varchar(256)存儲一個字符,使用2 bytes表示實際數據長度,一共需要3 bytes物理存儲空間。
varchar對于不同的RDBMS引擎,有不通的物理存儲方式,雖然有統(tǒng)一的邏輯意義。對于mysql的不同存儲引擎,其實現方法與數據的物理存放方式也不同。
4、InnoDB中的varchar
InnoDB中varchar的物理存儲方式與InnoDB使用的innodb_file_format有關。早期的innodb_file_forma使用的Antelope文件格式,支持redundant和compact兩種row_format。從5.5開始或者InnoDB1.1,可以使用一種新的file format,Barracuda。Barracuda兼容Redundant,另外還支持dynamic和compressed兩種row_format.
當innodb_file_format=Antelope,ROW_FORMAT=REDUNDANT 或者COMPACT。
innodb的聚集索引(cluster index)僅僅存儲varchar、text、blob字段的前768個字節(jié),多余的字節(jié)存儲在一個獨立的overflow page中,這個列也被稱作off-page。768個字節(jié)前綴后面緊跟著20字節(jié)指針,指向overflow pages的位置。
另外,在innodb_file_format=Antelope情況下,InnoDB中最多能存儲10個大字段(需要使用off-page存儲)。innodbd的默認page size為16KB,InnoDB單行的長度不能超過16k/2=8k個字節(jié),(768+20)*10 < 8k。
當innodb_file_format=Barracuda, ROW_FORMAT=DYNAMIC 或者 COMPRESSED
innodb中所有的varchar、text、blob字段數據是否完全off-page存儲,根據該字段的長度和整行的總長度而定。對off-page存儲的列,cluster index中僅僅存儲20字節(jié)的指針,指向實際的overflow page存儲位置。如果單行的長度太大而不能完全適配cluster index page,innodb將會選擇最長的列作為off-page存儲,直到行的長度能夠適配cluster index page。
5、MyISAM中的varchar
對于MyISAM引擎,varchar字段所有數據存儲在數據行內(in-line)。myisam表的row_format也影響到varchar的物理存儲行為。
MyISAM的row_format可以通過create或者alter sql語句設為fixed和dynamic。另外可以通過myisampack生成row_format=compresse的存儲格式。
當myisam表中不存在text或者blob類型的字段,那么可以把row_format設置為fixed(也可以為dynamic),否則只能為dynamic。
當表中存在varchar字段的時候,row_format可以設定為fixed或者dynamic。使用row_format=fixed存儲varchar字段數據,浪費存儲空間,varchar此時會定長存儲。row_format為fixed和dynamic,varchar的物理實現方式也不同(可以查看源代碼文件field.h和field.cc),因而myisam的row_format在fixed和dynamic之間發(fā)生轉換的時候,varchar字段的物理存儲方式也將會發(fā)生變化。

相關文章

  • Mysql快速插入千萬條數據的實戰(zhàn)教程

    Mysql快速插入千萬條數據的實戰(zhàn)教程

    這篇文章主要給大家介紹了關于Mysql快速插入千萬條數據的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • MySQL批量刪除海量數據的幾種方法總結

    MySQL批量刪除海量數據的幾種方法總結

    在數據庫的日常維護中,我們經常遇到需要刪除大量數據的場景,例如,刪除過期日志、清理歷史數據等,但如果一次性刪除大量數據,可能會導致鎖表、事務日志暴增、影響數據庫性能等問題,本文將介紹幾種高效批量刪除 MySQL 海量數據的方法,需要的朋友可以參考下
    2024-11-11
  • 詳解MySql存儲過程參數的入門使用

    詳解MySql存儲過程參數的入門使用

    這篇文章主要介紹了MySql存儲過程參數的入門使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • 利用rpm安裝mysql 5.6版本詳解

    利用rpm安裝mysql 5.6版本詳解

    眾所周知MySQL在很多領域都被廣泛的使用,尤其是很多互聯(lián)網企業(yè),諸如騰訊,阿里等等。那么本文將主要介紹如何通過rpm方式來安裝Mysql,這是比較簡單的一種安裝方式,文中介紹的很詳細,相信對于大家安裝mysql具有一定的參考借鑒價值,下面來一起看看吧。
    2016-11-11
  • Mysql數據庫值的添加、修改、刪除及清空操作實例

    Mysql數據庫值的添加、修改、刪除及清空操作實例

    這篇文章主要給大家介紹了關于Mysql數據庫值的添加、修改、刪除及清空操作的相關資料,文中通過示例代碼以及圖文介紹的非常詳細,需要的朋友可以參考下
    2021-06-06
  • Mysql 主從數據庫同步(centos篇)

    Mysql 主從數據庫同步(centos篇)

    Mysql 主從數據庫同步(centos篇),需要的朋友可以參考下。
    2011-05-05
  • mysql 獲取規(guī)定時間段內的統(tǒng)計數據

    mysql 獲取規(guī)定時間段內的統(tǒng)計數據

    這篇文章主要介紹了mysql 獲取規(guī)定時間段內的統(tǒng)計數據的相關資料,需要的朋友可以參考下
    2017-05-05
  • mysql 的replace into實例詳解

    mysql 的replace into實例詳解

    這篇文章主要介紹了mysql 的replace into實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • MySQL外鍵使用及說明詳解

    MySQL外鍵使用及說明詳解

    MySQL通過外鍵約束來保證表與表之間的數據的完整性和準確性。這篇文章還通過外鍵的使用條件和外鍵的好處定義語法方面介紹了mysql外鍵使用及說明,非常不錯,具有參考借鑒價值,需要的朋友一起看下吧
    2016-08-08
  • 徹底搞懂數據庫操作truncate delete drop關鍵詞的區(qū)別

    徹底搞懂數據庫操作truncate delete drop關鍵詞的區(qū)別

    這篇文章主要為大家介紹了數據庫操作truncate delete drop關鍵詞的區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09

最新評論

乐业县| 锦屏县| 化州市| 曲麻莱县| 华坪县| 凤城市| 错那县| 崇义县| 明星| 吉隆县| 柯坪县| 古田县| 修文县| 敦煌市| 平阴县| 广水市| 苍溪县| 邢台市| 清水河县| 垦利县| 于都县| 西峡县| 平果县| 江孜县| 凤台县| 泊头市| 青铜峡市| 临西县| 韶关市| 白山市| 左贡县| 黎平县| 新泰市| 满洲里市| 大城县| 大渡口区| 安义县| 韩城市| 东乌珠穆沁旗| 卢湾区| 东明县|