作者:吴炳锡 来源:http://wubx.net/ 联系方式: wubingxi#163.com 转载请注明作/译者和出处,并且不能用于商业用途,违者必究.

最近有几个同学问我varchar和text有啥别吗,这个问题,以前说真的也没太多的整理,以前遇到text在设计中就是尽可能的拆到另一个表中,保持主表尽量的瘦小,可以让innodb bp缓存更多的数据。

今天借次机会系统整理一下,主要从存储上,最大值,默认值几个方面进行比较。

BTW: 从ISO SQL:2003上讲VARCHAR是一个标准型,但TEXT不是(包括tinytext).varchar在MySQL 5.0.3之前只支持0-255byte, 在5.0.3之后才支持到0-65535byte.

从存储上讲:

1

2

3

4

5

6

7

8

-text是要要进overflow存储。也是对于text字段,不会和行数据存在一起。但原则上不会全部overflow,

会有768字节和原始的行存储在一块,多于768的行会存在和行相同的Page或是其它Page上。

-varchar在MySQL内部属于从blob发展出来的一个结构,在早期版本中innobase中,也是768字节以后进行overfolw存储。

-对于Innodb-plugin后:对于变长字段处理都是20Byte后进行overflow存储

(在新的row_format下:dynimiccompress)

说完存储后,说一下使用这些大的变长字段的缺点:

1

2

3

4

5

6

7

8

-在Innobase中,变长字段,是尽可能的存储到一个Page里,这样,如果使用到这些大的变长字段,会造成一个Page里能容纳的行

数很少,在查询时,虽然没查询这些大的字段,但也会加载到innodbbufferpool中,等于浪费的内存。

(bufferpool的缓存是按page为单位)(不在一个page了会增加随机的IO)

-在innodb-plugin中为了减少这种大的变长字段对内存的浪费,引入了大于20个字节的,都进行overflow存储,

而且希望不要存到相同的page中,为了增加一个page里能存储更多的行,提高bufferpool的利用率。这也要求我们,

如果不是特别需要就不要读取那些变长的字段。

那问题来了? 为什么varchar(255 )存储上和text很相似了,但为什么还要有varchar, mediumtext, text这些类型?

(从存储上来讲大于255的varchar可以说是转换成了text.这也是为什么varchar大于65535了会转成mediumtext)

我理解:这块是一方面的兼容,另一方面在非空的默认值上varchar和text有区别。从整体上看功能上还是差别的。

这里还涉及到字段额外开销的:

1

2

3

4

5

6

7

8

9

-varchar小于255byte1byteoverhead

-varchar大于255byte2byteoverhead

-tinytext0-2551byteoverhead

-text0-65535byte2byteoverhead

-mediumtext0-16M3byteoverhead

-longtext0-4Gb4byteoverhead

备注 overhead是指需要几个字节用于记录该字段的实际长度。

从处理形态上来讲varchar 大于768字节后,实质上存储和text差别不是太大了。 基本认为是一样的。

另外从8000byte这个点说明一下: 对于varcahr, text如果行不超过8000byte(大约的数,innodb data page的一半) ,overflow不会存到别的page中。基于上面的特性可以总结为text只是一个MySQL扩展出来的特殊语法有兼容的感觉。

默认值问题:

1

2

3

-对于text字段,MySQL不允许有默认值。

-varchar允许有默认值

总结:

1

2

3

4

5

6

7

8

9

根据存储的实现:可以考虑用varchar替代tinytext

如果需要非空的默认值,就必须使用varchar

如果存储的数据大于64K,就必须使用到mediumtext,longtext

varchar(255)和text在存储机制是一样的

需要特别注意varchar(255)不只是255byte,实质上有可能占用的更多。

特别注意,varchar大字段一样的会降低性能,所以在设计中还是一个原则大字段要拆出去,主表还是要尽量的瘦小

源码中类型:

1

2

3

4

5

6

7

8

9

10

--Field_str(abstract)

|--Field_longstr

||--Field_string

||--Field_varstring

||--Field_blob

||--Field_geom

||

|--Field_null

|--Field_enum

|--Field_set

(末完待续,也希望大家一块讨论一下)

参考:

http://yoshinorimatsunobu.blogspot.com/2010/11/handling-long-textsblobs-in-innodb-1-to.html

http://nicj.net/mysql-text-vs-varchar-performance/

http://www.pythian.com/blog/text-vs-varchar/

测试SQL及方法

PgSQL

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

createtabletb_01(

c1varchar(255),

c2varchar(255),

c3varchar(255),

c4varchar(255),

c5varchar(255),

c6varchar(255),

c7varchar(255),

c8varchar(255),

c9varchar(255),

c10varchar(255),

c11varchar(255)

)engine=Innodb;

insertintotb_01(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11)values(repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255));

ERROR1118(42000):Rowsizetoolarge(>8126).ChangingsomecolumnstoTEXTorBLOBorusingROW_FORMAT=DYNAMICorROW_FORMAT=COMPRESSEDmayhelp.Incurrentrowformat,BLOBprefixof768bytesisstoredinline.

(testing)root@localhost[wubx]>setglobalinnodb_file_format=BARRACUDA;

QueryOK,0rowsaffected(0.00sec)

(testing)root@localhost[wubx]>altertabletb_01row_format=dynamic;

QueryOK,0rowsaffected(0.19sec)

Records:0Duplicates:0Warnings:0

(testing)root@localhost[wubx]>insertintotb_01(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11)values(repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255));

QueryOK,1rowaffected(0.00sec)

setglobalinnodb_file_format=Antelope;

createtabletb_02(

c1varchar(2000),

c2varchar(2000),

c3varchar(2000),

c4varchar(2000),

c5varchar(2000),

c6varchar(2000),

c7varchar(2000),

c8varchar(2000)

)engine=Innodb;

insertintotb_02(c1,c2,c3,c4,c5,c6,c7,c8)values(repeat('吴',2000),repeat('吴',2000),repeat('吴',2000),repeat('吴',2000),repeat('吴',2000),repeat('吴',2000),repeat('吴',2000),repeat('吴',2000));

createtabletb_03(

c1text,

c2text,

c3text,

c4text,

c5text,

c6text,

c7text,

c8text,

c9text,

c10text,

c11text

)engine=Innodb;

insertintotb_03(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11)values(repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255));

(testing)root@localhost[wubx]>insertintotb_03(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11)values(repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255),repeat('吴',255));

ERROR1118(42000):Rowsizetoolarge(>8126).ChangingsomecolumnstoTEXTorBLOBorusingROW_FORMAT=DYNAMICorROW_FORMAT=COMPRESSEDmayhelp.Incurrentrowformat,BLOBprefixof768bytesisstoredinline.

setglobalinnodb_file_format=BARRACUDA;

altertabletb_03row_format=dynamic;

mysql text 转 varchar_varchar和text说不清的那些事 - MySQL Life相关推荐

  1. mysql中的blob和text区别

    mysql中的blob和text区别 经过查询资料发现 除了blob 还有tinyblob longblob mediumblob 当然text还有tinytext mediumtext longte ...

  2. ntext在mysql_varchar和text说不清的那些事

    数据库定义到char类型的字段时,不知道大家是否会犹豫一下,到底选char.nchar.varchar.nvarchar.text.ntext中哪一种呢?结果很可能是两种,一种是节俭人士的选择:最好是 ...

  3. MySQL数据类型之BLOB与TEXT及其最大存储限制

    https://blog.csdn.net/q3dxdx/article/details/51014357 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.n ...

  4. mysql hibernate mediumtext_mysql中的text,mediumtext,longtext在Hibernate中的类型映射

    (摘自http://congpeixue.iteye.com/blog/283402) 在Hibernate的配置中,我目前是采用Annotation的方式,不过原理应该都一样. 对于如下的属性: J ...

  5. MySQL提供了四种TEXT类型:TINYTEXT,TEXT,MEDIUMTEXT,和LONGTEXT

    除了CHAR和VARCHAR字符类型时,MySQL为我们提供了TEXT具有更多的功能,其类型CHAR和VARCHAR不能覆盖. 的TEXT是用于存储可以采取从1个字节到4 GB长格式文本字符串是有用的 ...

  6. jquery text方法html,jquery text(),html()方法的区别

    首先,html属性中有两个方法,一个有参,一个无参 1. 无参html():取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档,返回的是一个String 例子: h ...

  7. 【论文阅读】Text Gestalt: Stroke-Aware Scene Text Image Super-Resolution

    [论文阅读]Text Gestalt: Stroke-Aware Scene Text Image Super-Resolution 摘要 方法 Pixel-wise Supervision Modu ...

  8. 【aixiv2016】DeepText A Unified Framework for Text Proposal Generation and Text Detection in Natural I

    本文转载自: http://www.cnblogs.com/lillylin/p/6118268.html Zhuoyao Zhong--[aixiv2016]DeepText A Unified F ...

  9. Winform-ListViewItem的Text 与其 SubItems[0].Text关系

    ListViewItem的属性Text 与 SubItems[0].Text 的关系是:同一个 ListViewItem item = new ListViewItem(); item.Text = ...

最新文章

  1. MPB:扬州大学王梦芝组-​​反刍动物瘤胃原虫的分离培养与形态学分析
  2. 【下载】RSA1024及RSA2048加密算法漏洞CVE-2017-7526 问题出在GnuPG加密库
  3. iis php5.6.8配置,Windows 8.1 + IIS 8.5 + PHP 5.6.3配置
  4. 1024我摊牌了,谈谈自己2020剩余两月的学习计划
  5. 智能化网络管理 为企业信息化保驾护航
  6. java实现的代理的两种办法
  7. C++(STL):24 ---序列式容器stack用法
  8. 霍金的遗愿清单:离开地球,警惕人工智能
  9. PHP5时间相差八小时问题[三种方法]
  10. php json_decode NULL
  11. 发掘商业潜力 戴尔第13代服务器升级带动企业能效升级
  12. 打表找规律-灯泡状态数
  13. 在PS中读取敏感数据
  14. tensorflow 张量
  15. php数据传输神器,「curl」PHP中的传输神器
  16. 地图--WGS84 高德坐标 百度坐标的相互转换(好用推荐)
  17. 数据结构C语言版(答案)
  18. FatFs文件系统移植过程及中度分析
  19. TQ2440串口裸板程序uart0
  20. autocad是计算机软件吗,AutoCAD软件属于计算机辅助设计软件()

热门文章

  1. Excel统计函数COUNTIF()的常规用法介绍
  2. qqwry.dat 导入mysql_纯真IP数据库(qqwry.dat)转换成最新的IP数据库格式(ipwry.dat)
  3. 注册表mysql文件夹被删除怎么恢复_注册表的namespace文件夹里的文件被误删了如何恢復...
  4. 同步github上的项目到gitcafe
  5. Win10使用心得与技巧
  6. 小明和小强都是张老师的学生,张老师的生日是M月N日问题
  7. 车间生产排单系统构思
  8. Java学习第一天 环境变量的配置及不同jdk之间的随时更换(保姆级教学)
  9. PIGCMS 关闭聊天机器人(小黄鸡)
  10. 正则表达式测试(一)