MySQL基础 String类型CHAR和VARCHAR类型等 char类型转换varchar

【MySQL基础】String类型CHAR和VARCHAR类型等一下主要参考MySQL手册 最近要好好读。

主要讨论以下主题:

·CHAR和 VARCHAR介绍以及工作?

·CHAR和 VARCHAR 区别

·CHAR(4)和 VARCAHR(4)区别

·了解TEXT和 BLOB

·了解ENUM

字符串类型指CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET。该节描述了这些类型如何工作以及如何在查询中使用这些类型。

1.String类型

1.1.CHAR和VARCHAR类型

CHARtʃɑːVARCHARvɑ:(r)

CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和是否尾部空格被保留等方面也不同。在存储或检索过程中不进行大小写转换。

CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。例如,CHAR(30)可以占用30个字符。

CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。

同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。

VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。

下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:

CHAR(4)

存储需求

VARCHAR(4)

存储需求

''

''

4个字节

''

1个字节

'ab'

'ab'

4个字节

【MySQL基础】String类型CHAR和VARCHAR类型等 char类型转换varchar

'ab '

3个字节

'abcd'

'abcd'

4个字节

'abcd'

5个字节

'abcdefgh'

'abcd'

4个字节

'abcd'

5个字节

请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值保存,并且会出现错误。

从CHAR(4)和VARCHAR(4)列检索的值并不总是相同,因为检索时从CHAR列删除了尾部的空格。具体例子可以参考mysql手册。

1.2.BLOB和TEXT类型

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

BLOB列被视为二进制字符串(字节字符串)。TEXT列被视为非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值值。TEXT列有一个字符集,并且根据字符集的校对规则对值进行排序和比较。

在TEXT或BLOB列的存储或检索过程中,不存在大小写转换。

在大多数方面,可以将BLOB列视为能够足够大的VARBINARY列。同样,可以将TEXT列视为VARCHAR列。BLOB和TEXT在以下几个方面不同于VARBINARY和VARCHAR:

·当保存或检索BLOB和TEXT列的值时不删除尾部空格。(这与VARBINARY和VARCHAR列相同)。

请注意比较时将用空格对TEXT进行扩充以适合比较的对象,正如CHAR和VARCHAR。

·对于BLOB和TEXT列的索引,必须指定索引前缀的长度。对于CHAR和VARCHAR,前缀长度是可选的。

·BLOB和TEXT列不能有默认值。

1.3.ENUM类型

ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。

在某些情况下,ENUM值也可以为空字符串('')或NULL:

·如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。后面有详细讨论。

·如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且默认值为NULL。如果ENUM列被声明为NOTNULL,其默认值为允许的值列的第1个元素。

每个枚举值有一个索引:

·来自列规定的允许的值列中的值从1开始编号。

·空字符串错误值的索引值是0。这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行:

·mysql>SELECT * FROMtbl_nameWHEREenum_col=0;

·NULL值的索引是NULL。

例如,定义为ENUM的列('one','two','three')可以有下面所示任何值。还显示了每个值的索引:

索引

NULL

NULL

''

0

'one'

1

'two'

2

'three'

3

枚举最多可以有65,535个元素。

当创建表时,ENUM成员值的尾部空格将自动被删除。

当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM列分配字符集和校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。

如果在数值上下文中检索一个ENUM值,将返回列值的索引。例如,你可以这样从ENUM列搜索数值值:

mysql>SELECTenum_col+0 FROMtbl_name;

如果将一个数字保存到ENUM列,数字被视为索引,并且保存的值是该索引对应的枚举成员。(但是,这不适合LOADDATA,它将所有输入视为字符串)。不建议使用类似数字的枚举值来定义一个ENUM列,因为这很容易引起混淆。例如,下面的列含有字符串值'0'、'1'和'2'的枚举成员,但数值索引值为1、2和3:

numbers ENUM('0','1','2')

根据枚举成员在列定义中列出的顺序对ENUM值进行排序。(换句话说,ENUM值根据索引编号进行排序)。例如,对于ENUM('a','b'),'a'排在'b'前面,但对于ENUM('b','a'),'b'排在'a'前面。空字符串排在非空字符串前面,并且NULL值排在所有其它枚举值前面。要想防止意想不到的结果,按字母顺序规定ENUM列。还可以使用GROUPBYCAST(col ASCHAR)或GROUPBYCONCAT(col)来确保按照词汇对列进行排序而不是用索引数字。

如果你想要确定一个ENUM列的所有可能的值,使用SHOWCOLUMNS FROMtbl_nameLIKEenum_col,并解析输出中第2列的ENUM定义。

原文出自:http://www.cnblogs.com/hujj/archive/2012/03/22/2412004.html

分类: 数据库

  

爱华网本文地址 » http://www.aihuau.com/a/25101017/335654.html

更多阅读

竞彩返奖探讨,对北单和外围对比等问题 外围与竞彩对冲

正方,坚持认为竞猜有高达80%的返奖率,不必外围差:看到不少网友说竞彩69%的返奖率跟外围相差太大没玩头,我想指正一下。我认为竞彩返奖率69%对于串关固定奖金玩法只是个理想值,我个人推算可能是建立在三关以上和三关以下销量基本相同的理

手势寒暄和交谈坐姿等礼仪 念经时的坐姿手势

手势寒暄和交谈坐姿等礼仪人们在交谈时往往以手势配合谈话内容,达到表意表情的目的。如在谈话激动时,往往攥紧拳头;谈到高兴处,往往双手舞动等等。手势又常常可以为我们了解对方提供线索。如日本许多负责接待和社会事务工作的人员发现,当

声明:《MySQL基础 String类型CHAR和VARCHAR类型等 char类型转换varchar》为网友第一顺位分享!如侵犯到您的合法权益请联系我们删除