仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1001|回复: 8
打印 上一主题 下一主题

[学习教程] MYSQL网页设计MySQL 4.1.0 中文参考手册 --- 6.2 列...

[复制链接]
再现理想 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:45:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如IBM公司最近宣布让渠道合作伙伴分销其SaaS应用程序的新计划。微软认为MySQL学习教程是销售其云计算服务的重要组成部分。然而即使有这种趋势,DBaaS仍然不同于内部数据库,解决方案提供商必须认识到这一点;否则,他们不仅仅是丢失几个客户,而是要失去的更多。mysql|参考|参考手册|中文MySQL4.1.0中文参考手册---犬犬(心帆)翻译MySQLReferenceManualforversion4.1.0-alpha.

6.2列范例


MySQL撑持大批的列范例,它们能够被分为3类:数字范例、日期和工夫范例和字符串(字符)范例。这个章节起首给出可用范例的概述,而且总结各种型所需的存储需求,然后供应各种型中的范例范围更具体的形貌。概述成心地简化了。更具体的申明应当参考特写列范例的附加信息,比方你能为其指定值的同意格局。

MySQL撑持的列范例鄙人面列出。以下代码字母用于形貌中:

M指出最年夜的显现尺寸。最年夜的显现尺寸长度为255。D合用于浮点范例。指出跟从在十进制小数点后的数字数目。最年夜大概值为30,但不该年夜于M-2。
方括号(“[”and“]”)指定可选的范例润色部分。



注重,假如为一个列指定了ZEROFILL,MySQL将主动为这个列增加UNSIGNED属性。

告诫:你应当晓得当在两个整数范例值中利用减法时,若有一个为UNSIGNED范例,那末了局也是无标记的。检察章节6.3.5Cast函数。
TINYINT[(M)][UNSIGNED][ZEROFILL]一个十分小的整数。有标记的局限是-128到127。无标记的局限是0到255。BITBOOL它们是TINYINT(1)的同义词。SMALLINT[(M)][UNSIGNED][ZEROFILL]一个小整数。有标记的局限是-32768到32767。无标记的局限是0到65535。MEDIUMINT[(M)][UNSIGNED][ZEROFILL]一其中等巨细的整数。有标记的局限是-8388608到8388607。无标记的局限是0到16777215。INT[(M)][UNSIGNED][ZEROFILL]一个一般巨细的整数。有标记的局限是-2147483648到2147483647。无标记的局限是0到4294967295。INTEGER[(M)][UNSIGNED][ZEROFILL]INT的同义词。BIGINT[(M)][UNSIGNED][ZEROFILL]一个年夜的整数。有标记的局限是-9223372036854775808到9223372036854775807。无标记的局限是0到18446744073709551615。你应当晓得的有关BIGINT列的一些事变:一切的算术运算均是用有标记的BIGINT或DOUBLE值来完成的,因而你不该该利用年夜于9223372036854775807(63bits)的无标记年夜整数,除位函数以外!假如你如许做了,了局中的某些年夜数字大概会堕落,由于将BIGINT转换成DOUBLE时发生了舍进毛病。MySQL4.0鄙人列情形下能够处置BIGINT:在一个BIGINT列中利用整数存储一个年夜的无标记值。在MIN(big_int_column)和MAX(big_int_column)中。当两个操纵数都是整数时利用操纵符(+、-、*、等)。一般你能够在一个BIGINT列中以字符串体例存储的一个准确的整数。在这类情形下,MySQL将实行一个字符串到数字的转换,包含无intermediate的双精度暗示法。当两个参数均是整数值时,“-”、“+”和“*”将利用BIGINT运算!这就意味着,假如两个年夜整数的乘积(或函数的了局前往整数)的了局年夜于9223372036854775807时,你大概会失掉意想不到的了局。FLOAT(precision)[UNSIGNED][ZEROFILL]一个浮点型数字。precision能够是<=24作为一个单精度的浮点数字和介于25和53之间作为一个双精度的浮点数字。这些范例与上面形貌的FLOAT和DOUBLE范例类似。FLOAT(X)有与响应的FLOAT和DOUBLE范例一样的局限,可是显现尺寸和十进制小数位数是不决义的。在MySQL3.23中,它是一个实在的浮点值。而在MySQL初期的版本中,FLOAT(precision)一般有2小数位。注重,因为在MySQL中一切的盘算都是以双精度实行的,以是利用FLOAT大概带来一些意想不到的成绩。检察章节A.5.6办理没有婚配行的成绩。该句法是为了ODBC兼容而供应的。FLOAT[(M,D)][UNSIGNED][ZEROFILL]一个小的(单精度)浮点数字。同意的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。假如UNSIGNED被指定,负值是不同意的。M是显现宽度,D是小数位数。FLOAT没有参数或有X<=24的FLOAT(X)代表一个单精度的浮点数字。DOUBLE[(M,D)][UNSIGNED][ZEROFILL]一个一般巨细的(双精度)浮上数字。同意的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。假如UNSIGNED被指定,负值是不同意的。M是显现宽度,D是小数位数。DOUBLE没胡参数或有25<=X<=53的FLOAT(X)代表一个双精度的浮点数字。DOUBLEPRECISION[(M,D)][UNSIGNED][ZEROFILL]REAL[(M,D)][UNSIGNED][ZEROFILL]它们是DOUBLE同义词。DECIMAL[(M[,D])][UNSIGNED][ZEROFILL]一个未紧缩(unpacked)的浮点数。运作好像一个CHAR列:“unpacked”意味着数字是以一个字符串存储的,值的每位将利用一个字符。小数点而且关于正数,“-”标记不在M上钩算(可是它们的空间是被保存的)。假如D是0,值将没有小数点或小数部分。DECIMAL值的最年夜局限与DOUBLE分歧,可是关于一个给定的DECIMAL列,实践的局限能够被所选择的M和D限定。假如UNSIGNED被指定,负值是不同意的。假如D被疏忽,缺省为0。假如M被疏忽,缺省为10。在MySQL3.23之前,M参数必需包括标记与小数点所需的空间。DEC[(M[,D])][UNSIGNED][ZEROFILL]NUMERIC[(M[,D])][UNSIGNED][ZEROFILL]DECIMAL的同义词。DATE一个日期。撑持的局限是1000-01-01到9999-12-31。MySQL以YYYY-MM-DD格局显现DATE值,可是同意你以字符串或数字给一个DATE列赋值。检察章节6.2.2.2DATETIME、DATE和TIMESTAMP范例。DATETIME一个日期和工夫的组合。撑持的局限是1000-01-0100:00:00到9999-12-3123:59:59。MySQL以YYYY-MM-DDHH:MM:SS格局显现DATETIME值,可是同意你以字符串或数字给一个DATETIME列赋值。检察章节6.2.2.2DATETIME、DATE和TIMESTAMP范例。TIMESTAMP[(M)]一个工夫戳。局限是1970-01-0100:00:00到2037年间的恣意时候。MySQL4.0和更早版本中,TIMESTAMP值是以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格局显现的,它取决于M是不是是14(或省略)、12、8或6,可是同意你以字符串或数字给一个TIMESTAMP列赋值。从MySQL4.1入手下手,TIMESTAMP以YYYY-MM-DDHH:MM:DD格局作为字符前往。假如你你但愿以数字情势前往则必需在该工夫戳字段后加上+0。分歧的工夫戳长度是不撑持的。从MySQL4.0.12入手下手,选项--new能够被用来使服务器与4.1一样运作。TIMESTAMP列无益于纪录一个INSERT或UPDATE操纵的日期和工夫,由于假如你本人没有给它赋值,它将被主动地设置为比来一次操纵的日期和工夫。也能够经由过程给它赋一个NULL而使它设置为以后的日期和工夫。检察章节6.2.2Date和Time范例。参数M只影响一个TIMESTAMP列的显现格局;它的值老是占用4个字节存储。注重,当TIMESTAMP(M)列的M是8或14时,它前往的是数字而别的的TIMESTAMP(M)列前往的是字符串。这仅仅是为了能够牢靠地转储并恢复到别的格局的表中。检察章节6.2.2.2DATETIME、DATE和TIMESTAMP范例。TIME一个工夫。局限是-838:59:59到838:59:59。MySQL以HH:MM:SS格局显现TIME值,可是同意你利用字符串或数字来给TIME列赋值。检察章节6.2.2.3TIME范例。YEAR[(2|4)]一个2或4位数字格局的年(缺省为4位)。同意的值是1901到2155、0000(4位年格局)和利用2位格局的1970-2069(70-69)。MySQL以YYYY格局显现YEAR值,可是同意你利用字符串或数字来给YEAR列赋值。(YEAR范例在MySQL3.22之前不撑持。)检察章节6.2.2.4YEAR范例。[NATIONAL]CHAR(M)[BINARY]一个定长的字符串,当存储时,老是以空格填满右侧到指定的长度。M的局限是0到255(在MySQL3.23版本之前为1到255)。当该值被检索时,尾部空格将被删除。CHAR值依据缺省的字符集举行疏忽巨细写的排索与对照,除非指定了关头词BINARY。NATIONALCHAR(或短情势NCHAR)是以ANSISQL体例界说一个CHAR列,它将利用缺省的字符集。这在MySQL中是默许的。CHAR是CHARACTER的缩写。MySQL同意以CHAR(0)范例创建一个列。一些老程序运转时必须一个列,却又其实不利用这个列的值,你就不能不为了顺应它而创建该列,在这情形下,CHAR(0)将是很无益的。当必要一个列仅保留两个值时:一个为CHAR(0)(该列没有界说为NOTNULL),这将仅占用一个比特位来存储2个值:NULL或""。检察章节6.2.3.1CHAR和VARCHAR范例。CHAR这是CHAR(1)的同义词。[NATIONAL]VARCHAR(M)[BINARY]一个变长的字符串。注重:尾部的空格在存储时将会被删除(这与ANSISQL约规分歧)。M的局限是0到255(在MySQL4.0.2之前的版本中是1到255)。VARCHAR值以巨细写疏忽体例举行排索与对照,除非关头词BINARY被指定。检察章节6.5.3.1隐式的列界说变更。VARCHAR是CHARACTERVARYING的缩写。检察章节6.2.3.1CHAR和VARCHAR范例。TINYBLOBTINYTEXT一个BLOB或TEXT列,最年夜长度为255(2^8-1)个字符。检察章节6.5.3.1隐式的列界说变更。检察章节6.2.3.2BLOB和TEXT范例。BLOBTEXT一个BLOB或TEXT列,最年夜长度为65535(2^16-1)个字符。检察章节6.5.3.1隐式的列界说变更。检察章节6.2.3.2BLOB和TEXT范例。MEDIUMBLOBMEDIUMTEXT一个BLOB或TEXT列,最年夜长度为16777215(2^24-1)个字符。检察章节6.5.3.1隐式的列界说变更。检察章节6.2.3.2BLOB和TEXT范例。LONGBLOBLONGTEXT一个BLOB或TEXT列,最年夜长度为4294967295(2^32-1)个字符。检察章节6.5.3.1隐式的列界说变更。注重,因为服务器/客户真个协定和MyISAM表一般有一个16M每通讯包/表行的限定,你仍旧不克不及利用这个范例的全部局限。检察章节6.2.3.2BLOB和TEXT范例。ENUM(value1,value2,...)一个列举范例。一个仅能有一个值的字符串工具,这个值选自值列value1、value2、...、NULL或特别的""堕落值。一个ENUM列能够有最年夜65535分歧的值。检察章节6.2.3.3ENUM范例。SET(value1,value2,...)一个汇合。一个能有零个或更多个值的字符串工具,个中每一个值必需选自值列value1、value2、...。一个SET列能够有最年夜64个成员。检察章节6.2.3.4SET范例。6.2.1数字范例
MySQL撑持一切的ANSI/ISOSQL92数字范例。这些范例包含正确数字的数据范例(NUMERIC、DECIMAL、INTEGER和SMALLINT),也包含近似数字的数据范例(FLOAT、REAL和DOUBLEPRECISION)。关头词INT是INTEGER的同义词,关头词DEC是DECIMAL的同义词。

NUMERIC和DECIMAL范例被MySQL以一样的范例完成,这在SQL92尺度中是同意的。他们用于保留瞄准确精度有主要请求的值,比方与款项有关的数据。当以它们中的之一声明一个列时,精度和数值局限能够(一般是)被指定;比方:

salaryDECIMAL(5,2)

在这个例子中,5(精度(precision))代表主要的十进制数字的数量,2(数据局限(scale))代表在小数点后的数字位数。在这类情形下,因而,salary列能够存储的值局限是从-99.99到99.99。(实践上MySQL在这个列中能够存储的数值能够一向到999.99,由于它没有存储负数的标记)。

译者注:
M与D对DECIMAL(M,D)取值局限的影响范例申明取值局限(MySQL=3.23)DECIMAL(4,1)-9.9到99.9-999.9到9999.9DECIMAL(5,1)-99.9到999.9-9999.9到99999.9DECIMAL(6,1)-999.9到9999.9-99999.9到999999.9DECIMAL(6,2)-99.99到999.99-9999.99到99999.99DECIMAL(6,3)-9.999到99.999-999.999到9999.999#在MySQL3.23及今后的版本中,DECIMAL(M,D)的取值局限即是初期版本中的DECIMAL(M+2,D)的取值局限。
正文停止:


在ANSI/ISOSQL92中,句法DECIMAL(p)等价于DECIMAL(p,0)。一样的,在实行被同意决意值p的中央,句法DECIMAL等价于DECIMAL(p,0)。MySQL今朝还不撑持DECIMAL/NUMERIC数据范例的这些变体情势中的任一种。一样平常来讲这并非一个严峻的成绩,经由过程明白地把持精度和数值局限能够失掉这些范例的次要功效好处。

DECIMAL和NUMERIC值是作为字符串存储的,而不是作为二进制浮点数,以便回护这些值的十进制准确度。一个字符用于数值的每位、小数点(假如scale>0)和“-”标记(关于负值)。假如scale是0,DECIMAL和NUMERIC值不包括小数点或小数部分。

DECIMAL和NUMERIC值的最年夜局限与DOUBLE分歧,可是关于一个给定的DECIMAL或NUMERIC列,它的实践局限可制订该列时的precision或scale限定。当如许的列被赋给了小数点的位数凌驾scale所指定的值时,该将依据scale举行四舍五进。当一个DECIMAL或NUMERIC列被赋予一个巨细凌驾指定(或缺省)的precisionandscale的限止局限时,MySQL以该列局限的端点值存储该值。
示例(译者注):
mysql>CREATETABLE`tA`(->`id`int(4)unsignedzerofillNOTNULL,->`salary`decimal(5,2),->PRIMARYKEY(`id`)->)TYPE=MyISAM;QueryOK,0rowsaffected(0.00sec)mysql>INSERTINTO`tA`(`id`,`salary`)->VALUES(1,-99.99),#以数字体例拔出->(2,"99.99"),#以字符串体例拔出->(3,-999.99),->(4,"9999.99"),->(5,-1000.00),#decimal(5,2)最小局限为-999.99该值拔出时了局为-999.99->(6,"10000.00"),#decimal(5,2)最年夜局限为9999.99该值拔出时了局为9999.99->(7,"-99.999"),#小数位数凌驾scale指定值,但因以字符串体例拔出,了局值仅截往过剩部分->(8,"99.9999"),->(9,-99.999),#小数位数凌驾scale指定值,对该值举行四舍五进,了局为-100.00->(10,99.9999);QueryOK,10rowsaffected(0.00sec)Records:10Duplicates:0Warnings:4mysql>SELECT*FROM`tA`;+------+---------+|id|salary|+------+---------+|0001|-99.99||0002|99.99||0003|-999.99||0004|9999.99||0005|-999.99||0006|9999.99||0007|-99.99||0008|99.99||0009|-100.00||0010|100.00|+------+---------+10rowsinset(0.00sec)*以上了局在MySQL4.0.12中测试
示例停止(译者注)
作为对ANSI/ISOSQL92尺度的一个扩大,MySQL也撑持下面的表格所列出的整型范例TINYINT、MEDIUMINT和BIGINT。别的一个扩大是MySQL撑持随便指定一个整型数值的显现格局,这经由过程在范例的基础关头词后跟一个括号来完成(比方INT(4))。这个可选的宽度规格申明是用于在数值显现时,对某些值的宽度短于该列宽度的值举行左弥补显现的,而不是为了限定在该列中存储值的宽度,也不是为了限定那些凌驾该列指定宽度的值的可被显现的数字位数。当与可选的扩大属性ZEROFILL一同利用时,缺省弥补用的空格被零取代。举例来讲,一个列被界说为INT(5)ZEROFILL,拔出的值4被检索出来时为00004。注重,假如在一个整型列中存储一个凌驾显现宽度的更年夜值时,当MySQL为某些庞大的联合(join)天生一时表时,你大概会碰到成绩,由于在这类情形下,MySQL信托地以为一切的值均合适原始的列宽度。
示例(译者注):
mysql>CREATETABLE`tA`(->`id`int(4)unsignedzerofillNOTNULL,->PRIMARYKEY(`id`)->)TYPE=MyISAM;QueryOK,0rowsaffected(0.00sec)mysql>INSERTINTO`tA`(`id`)->VALUES(1),(12),(1234),(12345678);QueryOK,4rowsaffected(0.01sec)Records:4Duplicates:0Warnings:0mysql>SELECT*FROM`tA`;+----------+|id|+----------+|0001||0012||1234||12345678|+----------+4rowsinset(0.00sec)*以上了局在MySQL4.0.12中测试
示例停止(译者注)
一切的整型范例能够有一个可选(非尺度的)属性UNSIGNED。假如但愿在一个列中只同意正值而且必要一个稍年夜一点的数字局限,就能够利用无标记值。

从MySQL4.0.2入手下手,浮点范例也能够存在UNSIGNED。与整型范例分歧的,这个属性能够避免在该列中存在负值。而与整型范例纷歧致的,该列的高部局限仍旧与原局限坚持分歧。

FLOAT范例被用于暗示近似数字的数值范例。ANSI/ISOSQL92尺度同意一个可选的精度申明(但不是指数的局限),跟在关头词FLOAT后的括号内。MySQL完成也撑持这个可选的精度规格申明。当关头词被用于一个列的范例申明而没有精度规格申明时,MySQL利用四个字节来存储该字段值。在关头词FLOAT后的括号里给出两个数字,这类变形的句法也是被撑持的。利用这个选项时,第一个数字持续暗示值存储所占的字节数,第二个数字指定能被存储和显现的跟从在小数点后的位数(就像DECIMAL和NUMERIC)。当MySQL被请求为如许的一个列存储一个小数点后的小数位数凌驾指定值的数值时,该值将会被四舍五进,往除分外的位。
示例(译者注):
mysql>CREATETABLE`tA`(->`id`int(4)unsignedzerofillNOTNULL,->`float_date`float(4,2)unsignedNOTNULL,->PRIMARYKEY(`id`)->)TYPE=MyISAM;QueryOK,0rowsaffected(0.00sec)mysql>INSERTINTO`tA`(`id`,`float_date`)->VALUES(1,-100),#拔出有效的负值->(2,100.99),#以数字体例拔出->(3,"100.99"),#以字符串体例拔出->(4,"100.99999"),#小数位数凌驾指定倍数,该值举行四舍五进->(5,100.99999),->(6,"100.9911"),->(7,100.9911);QueryOK,7rowsaffected(0.00sec)Records:7Duplicates:0Warnings:1mysql>SELECT*FROM`tA`;+------+------------+|id|float_date|+------+------------+|0001|0.00||0002|100.99||0003|100.99||0004|101.00||0005|101.00||0006|100.99||0007|100.99|+------+------------+7rowsinset(0.00sec)*以上了局在MySQL4.0.12中测试
示例停止(译者注)
REAL和DOUBLEPRECISION范例不承受精度规格申明。作为对ANSI/ISOSQL92尺度的扩大,MySQL承受DOUBLE作为DOUBLEPRECISION范例的一个同义词。尺度请求REAL的精度比用于DOUBLEPRECISION的更小,而与之相反的,MySQL以8字节的双精度浮点值(当不以“ANSI形式”运转时)来完成二者。为了失掉最年夜的可移植性,近似数字的数值存储所需代码应当利用没有精度或小数位数规格申明的FLOAT或DOUBLEPRECISION范例。

当试图在一个数字列中存储一个凌驾该列同意局限的值时,MySQL会剪切该值到局限内的得当端点值,并以了局值取代存储。

举例来讲,一个整型列的局限是-2147483648到2147483647。假如试图在一个INT列中拔出值-9999999999,该值将会被剪切到该局限的低部端点,以-2147483648取代存储。一样的,假如试图拔出9999999999,2147483647将被取代存储。

假如INT列是UNSIGNED的,列的局限巨细是分歧的,不外它的端点挪动到了0和4294967295。假如你试图存储-9999999999和9999999999,而实践列中存储的值将会酿成0和4294967296。

关于ALTERTABLE、LOADDATAINFILE、UPDATE和多行INSERT语句,因为剪切产生的转换,将以“Warnings”被呈报。
范例占用字节从到TINYINT1-128127SMALLINT2-3276832767MEDIUMINT3-83886088388607INT4-21474836482147483647BIGINT8-922337203685477580892233720368547758076.2.2Date和Time范例


日期和工夫范例有DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个范例均有正当值的局限,当给它们赋于一个真正分歧法的值时,这些值将会被“零”取代。注重,MySQL同意存储某个“不严厉地”正当的日期,比方1999-11-31。如许做的缘故原由是,我们以为使用程序有义务来处置日期正当性的反省,而不是由SQL服务器来处置。为了“加速”对日期的反省,MySQL仅反省月份应在0-12局限内,和天在0-31局限内。由于下面所述的局限界说体例,MySQL因此同意你在一个DATE或DATETIME列中存储日或月日均为0的日期。当一个使用程序但愿存储一个出身日期,而你其实不知正确的出身日月时,这将变得十分有效。在这类情形下,你能够复杂地以1999-00-00或1999-01-00情势存储日期。(固然你不克不及希冀DATE_SUB()或DATE_ADD之类的函数能准确地处置如许的日期,并失掉准确的值。)

当利用日期和工夫范例事情时,这里有一些要记着的总则:
MySQL对一个给定的日期或工夫范例以尺度的格局举行检索,可是它会勉力以各类格局婚配注释你所供应的(比方,当你指定一个值,将其赋给一个日期或工夫范例或与之对照时)。但是,只鄙人脸部分所形貌的格局是被撑持的。希冀你可以供应正当的值,假如你利用别的格局的值,大概会形成没法意料的了局。只管MySQL会实验以各类格局注释值,它一般希冀日期的年部分放在最右边。日期必需以年-月-日序次给出(比方,98-09-04),而不是别的中央经常使用的月-日-年或日-月-年序次(比方,09-04-98、04-09-98)。假如一个值被用于在数字的语境中,MySQL将主动地将一个日期或工夫范例值转换成数字,反之亦然。当MySQL碰到一个日期或工夫范例的值超越局限或对该范例是一个分歧法的值时(检察这个章节的开首部分),它会将该范例的值变更到“零”值。(破例的是超越局限的TIME值将被剪切为得当的TIME局限端点值。)下表每品种型的“零”值格局:列范例“零”值DATETIME0000-00-0000:00:00DATE0000-00-00TIMESTAMP00000000000000(长度取决于显现格局)TIME00:00:00YEAR0000“零”值是特别的,可是你能够以表中显现的值来明白地存储或援用他们。你也能够利用值0或0,这更容易于誊写。在MyODBC2.50.12和以上的版本中,“零”值的日期和工夫值经由过程MyODBC将被主动转换成NULL,由于ODBC不克不及够处置如许的值。6.2.2.1Y2K成绩和日期范例


MySQL本身是Y2K平安的(检察章节1.2.52000年兼容性),可是呈交给MySQL的值大概并非。任何一个包括2位年份的值是存在二义性的,由于世纪值是未知的。如许的值必需被注释为4位格局,由于MySQL外部利用四位存储年份。

关于DATETIME、DATE、TIMESTAMP和YEAR范例,MySQL利用以下划定规矩注释存在二义性的年份值:
在局限00-69内的年值被转换为2000-2069。在局限Y70-99内的年值被转换为1970-1999。
记着,这些划定规矩仅仅供应关于你的数据寄义的公道推测。假如MySQL利用的探究法没法失掉准确的值,你应当以包括4位年份的格局供应一个明白的值。

ORDERBY将以得当的按次对2位YEAR/DATE/DATETIME范例排序。

注重,某些像MIN()和MAX()之类的函数会将TIMESTAMP/DATE转换为一个数字。这就意味着,一个2位年份的工夫戳将完整不克不及与这些函数一同事情。在这类情形下,办理的举措是将TIMESTAMP/DATE转换为4位年份格局大概利用诸如MIN(DATE_ADD(timestamp,INTERVAL0DAYS))的办法。
6.2.2.2DATETIME、DATE和TIMESTAMP范例


DATETIME、DATE和TIMESTAMP范例是类似的。这个章节形貌了它们的特征和它们的类似点与分歧点。

DATETIME范例可用于必要同时包括日期和工夫信息的值。MySQL以YYYY-MM-DDHH:MM:SS格局检索与显现DATETIME范例。撑持的局限是1000-01-0100:00:00到9999-12-3123:59:59。(“撑持”的寄义是,只管更早的值大概事情,但不克不及包管他们都可以。)

DATE范例可用于必要一个日期值而不必要工夫部分时。MySQL以YYYY-MM-DD格局检索与显现DATE值。撑持的局限是1000-01-01到9999-12-31。

TIMESTAMP列范例供应了一品种型,经由过程它你能够以以后操纵的日期和工夫主动地标志INSERT或UPDATE操纵。假如一张表中有多个TIMESTAMP列,只要第一个被主动更新。

主动更新第一个TIMESTAMP列鄙人列任何前提下产生:
列值没有明白地在一个INSERT或LOADDATAINFILE语句中被指定。列值没有明白地在一个UPDATE语句中被指定,而且别的的一些列值已产生改动。(注重,当一个UPDATE设置一个列值为它原有值时,这将不会引发TIMESTAMP列的更新,由于,假如你设置一个列值为它以后值时,MySQL为了效力为疏忽更新。)明白地以NULL设置TIMESTAMP列。
第一个列之外别的TIMESTAMP列,能够设置到以后的日期和工夫,只需将该列赋值NULL或NOW()。

任何TIMESTAMP列都可以被设置一个分歧于以后操纵日期与工夫的值,这经由过程为该列明白指定一个你所希冀的值来完成。这也合用于第一个TIMESTAMP列。这个选择性是很有效的,举例来讲,当你但愿TIMESTAMP列保留该纪录行被新增加时确当前的日期和工夫,但该值不再产生改动,不管今后是不是对该纪录行举行过更新:
当该纪录行被创建时,让MySQL设置该列值。这将初始化该列为以后日期和工夫。今后当你对该纪录行的别的列实行更新时,为TIMESTAMP列值明白地指定为它本来的值。
另外一方面,你大概发明更简单的办法,利用DATETIME列,当新建纪录行时以NOW()初始化该列,今后在对该纪录行举行更新时不再处置它。

示例(译者注):
mysql>CREATETABLE`tA`(->`id`int(3)unsignedNOTNULLauto_increment,->`date1`timestamp(14)NOTNULL,->`date2`timestamp(14)NOTNULL,->PRIMARYKEY(`id`)->)TYPE=MyISAM;QueryOK,0rowsaffected(0.01sec)mysql>INSERTINTO`tA`SET`id`=1;QueryOK,1rowaffected(0.02sec)#没有明白地指定第一个timestamp列值,该列值被设为拔出确当前时候#没有明白地指定别的的timestamp列值,MySQL则以为拔出的是一个不法值,而该列值被设为0mysql>INSERTINTO`tA`VALUES(2,NOW(),NULL);QueryOK,1rowaffected(0.01sec)mysql>SELECT*FROM`tA`;+----+----------------+----------------+|id|date1|date2|+----+----------------+----------------+|1|20030503104118|00000000000000||2|20030503104254|20030503104254|+----+----------------+----------------+2rowsinset(0.00sec)mysql>UPDATE`tA`SET`id`=3WHERE`id`=1;QueryOK,1rowaffected(0.01sec)Rowsmatched:1Changed:1Warnings:0#对某一纪录行举行了更新,第一个timestamp列值也将被更新mysql>UPDATE`tA`SET`id`=2WHERE`id`=2;QueryOK,0rowsaffected(0.00sec)Rowsmatched:1Changed:0Warnings:0#MySQL疏忽了此次操纵,第一个timestamp列值不会被更新mysql>SELECT*FROM`tA`;+----+----------------+----------------+|id|date1|date2|+----+----------------+----------------+|3|20030503104538|00000000000000||2|20030503104254|20030503104254|+----+----------------+----------------+2rowsinset(0.00sec)mysql>UPDATE`tA`SET`id`=1,`date1`=`date1`WHERE`id`=3;QueryOK,1rowaffected(0.00sec)Rowsmatched:1Changed:1Warnings:0#明白地指定了第一个timestamp列值为它原有值,该值将不会被更新mysql>SELECT*FROM`tA`;+----+----------------+----------------+|id|date1|date2|+----+----------------+----------------+|1|20030503104538|00000000000000||2|20030503104254|20030503104254|+----+----------------+----------------+2rowsinset(0.00sec)*以上了局在MySQL4.0.12中测试
示例停止(译者注)


TIMESTAMP值能够从1970到2037之间的任一时候,精度为一秒。其值作为数字显现。

MySQL检索与显现TIMESTAMP值的格局取决于它的显现尺寸,形貌以下表。“完全”的TIMESTAMP格局是14位的,可是TIMESTAMP列能够以一个更短的显现尺寸创建:
列范例显现格局TIMESTAMP(14)YYYYMMDDHHMMSSTIMESTAMP(12)YYMMDDHHMMSSTIMESTAMP(10)YYMMDDHHMMTIMESTAMP(8)YYYYMMDDTIMESTAMP(6)YYMMDDTIMESTAMP(4)YYMMTIMESTAMP(2)YY
一切的TIMESTAMP列均有一个不异的存储尺寸,而不思索显现尺寸的巨细。最多见的显现尺寸为6、8、12和14。你能够在表创立时指定一个恣意的显现尺寸,可是值0或比14年夜的值将会被强迫界说为列长14。在从1~13局限内的奇数会被强迫为下一个更年夜的偶数。

比方(译者注):字段界说强迫字段长度TIMESTAMP(0)TIMESTAMP(14)TIMESTAMP(15)TIMESTAMP(14)TIMESTAMP(1)TIMESTAMP(2)TIMESTAMP(5)TIMESTAMP(6)


注重:从MySQL4.1入手下手,TIMESTAMP以YYYY-MM-DDHH:MM:DD格局作为字符串前往。分歧的工夫戳长度不再被撑持。

译者注:假如你你但愿在MySQL4.1中以数字情势前往工夫戳,则必需在该工夫戳字段后加上+0。从MySQL4.0.12入手下手,选项--new能够被用来使服务器与4.1一样运作。

你可使用经常使用的格局会合的任何一个指定DATETIME、DATE和TIMESTAMP值:
一个YYYY-MM-DDHH:MM:SS或YY-MM-DDHH:MM:SS格局的字符串。一个“宽松”的语法是被同意的:以任何标点标记作为日期部分和工夫部分中的定界符。比方,98-12-3111:30:45、98.12.311+30+45、98/12/3111*30*45和98@12@3111^30^45均是等价的。一个YYYY-MM-DD或YY-MM-DD格局的字符串。这里,一个“宽松”的语法一样也是被同意的:比方,98.12.31、98-12-31、98/12/31和98@12@31是等价的。一个无定界符的YYYYMMDDHHMMSS或YYMMDDHHMMSS格局的字符串,只需字符串看起来像是一个日期。比方,19970523091528和970523091528均被注释为1997-05-2309:15:28,可是971122129015倒是守法的(它的分部分是偶然义的),该值被拔出时将酿成0000-00-0000:00:00。一个无定界符的YYYYMMDD或YYMMDD格局的字符串,只需字符串看起来像是一个日期。比方,19970523和970523被注释成为1997-05-23,可是971332倒是守法的(它的月和日部分是偶然义的),该值被拔出时将酿成0000-00-00。一个YYYYMMDDHHMMSS或YYMMDDHHMMSS格局的数字,只需数字看起来像是一个日期。比方,19830905132800和830905132800被注释成为1983-09-0513:28:00。一个YYYYMMDD或YYMMDD格局的数字,只需数字看起来像是一个日期。比方,19830905和830905被注释成为1983-09-05。在一个DATETIME、DATE或TIMESTAMP语境中,一个函数的前往值将随之而变更,比方NOW()或CURRENT_DATE。
不法的DATETIME、DATE或TIMESTAMP值将会被转换到得当情势的“零”值(0000-00-0000:00:00、0000-00-00或00000000000000)。

关于以字符串格局指定的包括日期定界符的值,不用要为小于10的月或天的值指定2位数字。1979-6-9同等于1979-06-09。一样的,关于以字符串指定的包括工夫定界符的值,不用要为小于10的时、分或秒指定2位数字。1979-10-301:2:3同等于1979-10-3001:02:03。

以数字指定的值应当是6、8、12或14位长。假如数字是8或14位长的,该值将被假定为年份是由头4位数字给出的YYYYMMDD或YYYYMMDDHHMMSS格局。假如数字是6或12数字长,它将被假定为年份是由头2位数字给出的YYMMDD或YYMMDDHHMMSS格局。不是这些长度之一的数字经由过程在值前补零到最靠近的长度后注释。

以没有定界符的字符串格局指定的值经由过程它们给出的长度来注释。假如字符串是8或14个字符长,则假定年份由前4个字符给出。不然,年份由前2个字符给出。关于字符串中呈现的多个部分,字符串以从左到右的按次被注释,以找出年、月、日、时、分和秒值。这就意味着,你不就利用少于6个字符的字符串。比方,假如指定9903,你大概以为它代表1999年3月,但你将会发明MySQL会将一个“零”值拔出到你的表中。这是由于,年份和月份分离为99和03,可是日期部分丧失(为0),因而这个值是分歧法的。

TIMESTAMP列老是以完整精度存储给定的正当值,而不思索显现尺寸的巨细。这包括几个寄义:
赋值时老是给出年、月和日,即便你的列范例界说为TIMESTAMP(4)或TIMESTAMP(2)。不然,该值将是分歧法的,而被0取代存储。
示例(译者注):
mysql>CREATETABLE`tA`(->`id`int(3)unsignedNOTNULLauto_increment,->`date1`timestamp(4)NOTNULL,->PRIMARYKEY(`id`)->)TYPE=MyISAM;QueryOK,0rowsaffected(0.01sec)mysql>INSERTINTO`tA`(`id`,`date1`)->VALUES(1,NULL),#拔出以后日期和工夫->(2,0305),#以数字格局给出值,而值长度小于6,在最右边补0至6位数字->(3,0305);#以字符串格局给出值,而值长不包含年、月和日,因此是一个不法值QueryOK,3rowsaffected(0.01sec)Records:3Duplicates:0Warnings:1mysql>SELECT*FROM`tA`;+----+-------+|id|date1|+----+-------+|1|0305||2|0003||3|0000|+----+-------+3rowsinset(0.00sec)*以上了局在MySQL4.0.12中测试
示例停止(译者注)

假如以ALTERTABLE拓展一个TIMESTAMP窄列,之前被“潜伏”的信息将被显现出来。
示例(译者注):
*接上例了局mysql>ALTERTABLE`ta`CHANGE`date1``date1`TIMESTAMP(11);QueryOK,3rowsaffected(0.01sec)Records:3Duplicates:0Warnings:0#设置`date1`为TIMESTAMP(11),MySQL会主动将其转化为TIMESTAMP(11)mysql>SELECT*FROM`tA`;+----+--------------+|id|date1|+----+--------------+|1|030503150142||2|000305000000||3|000000000000|+----+--------------+3rowsinset(0.00sec)*以上了局在MySQL4.0.12中测试
示例停止(译者注):

一样的,减少一个TIMESTAMP列的宽度不会引发信息的丧失,除在感到上值在被显现时显现了较少的信息。只管TIMESTAMP列值是以全体精度存储的,可是UNIX_TIMESTAMP()是独一能间接操纵外部存储值的函数。别的的函数操纵的是格局化后的检索的值。这就意味着不克不及够利用诸如HOUR()或SECOND()之类的函数,除非相干部分存在于格局化后的TIMESTAMP值中。比方,在小于10的显现格局上,为了使TIMESTAMP列中的HH部分可以显现,显现格局的尺寸必需不小于10,因而在一个更短的TIMESTAMP列值上利用HOUR()将会发生一个偶然义的了局。
示例(译者注):
*接上例了局#以下示例了局与上述了局相悖mysql>ALTERTABLE`ta`CHANGE`date1``date1`TIMESTAMP(4);QueryOK,3rowsaffected(0.02sec)Records:3Duplicates:0Warnings:0mysql>SELECT*FROM`tA`;+----+-------+|id|date1|+----+-------+|1|0305||2|0003||3|0000|+----+-------+3rowsinset(0.01sec)mysql>SELECTHOUR(`date1`)FROM`tA`;+---------------+|Hour(`date1`)|+---------------+|15||0||NULL|+---------------+3rowsinset(0.02sec)mysql>SELECTSECOND(`date1`)FROM`tA`;+-----------------+|second(`date1`)|+-----------------+|42||0||NULL|+-----------------+3rowsinset(0.01sec)*以上了局在MySQL4.0.12中测试
示例停止(译者注):


在某种程序上,你能够将一个日期值赋给另外一种日期范例的工具。但是,这大概会使值发生改动或丧失一部分信息。
假如将一个DATE值赋给一个DATETIME或TIMESTAMP工具,了局值的工夫部分将被设为00:00:00,由于DATE值不包括工夫信息。假如将一个DATETIME或TIMESTAMP值赋给一个DATE工具,了局值的工夫部分被删除,由于DATE范例不克不及存储工夫信息。记着,只管DATETIME、DATE和TIMESTAMP值全都能够用一样的格局集来指定,但一切范例不都有同有一样的值局限。比方,TIMESTAMP值不克不及早于1970或晚于2037。这就意味着,一个日期比方1968-01-01,作为一个DATETIME或DATE值是正当的,但不是一个无效的TIMESTAMP值,当它被赋于一个如许的工具时,它将被转换为0。
当指定日期值时,小心某些掉误:
你大概会被以字符串指定值时所同意的宽松格局棍骗。比方,一个值如10:11:12的,由于分界符“:”大概看起来像是一个工夫值,可是当它被用于一个日期语境中时,它将被注释成为2010-11-12年。而值10:45:15将被转换成0000-00-00,由于45是一个分歧法的月份。MySQL服务器仅对日期的无效性实行基础的查验:天为00-31,月为00-12,年为1000-9999。任何不是这个局限内的日期将被转换为0000-00-00。请注重,这仍旧同意你存储一个有效的日期比方2002-04-31。它同意一个WEB使用程序不举行进一步的反省而存储一个表单中的数据。为了确保一个日期值的无效性,在你的使用程序里实行无效性反省。以两位数字指定年份是存在二义性的,由于世纪是未知的。MySQL以上面的划定规矩注释一个2位年份值:00-69局限的年份值被转换为2000-2069。70-99局限的年份值被转换为1970-1999。6.2.2.3TIME范例


MySQL以HH:MM:SS格局(或对年夜的小时价时利用HHH:MM:SS格局)检索和显现TIME值。TIME值的局限能够从-838:59:59到838:59:59。小时部分能够这么年夜的缘故原由是,TIME范例不但能够用于暗示一天的工夫(这必定不会凌驾24小时),并且能够用来暗示所经由的工夫或两个事务之间的工夫距离(这大概比24小时年夜很多或是一个负值)。

TIME值能够多种格局指定:
一个DHH:MM:SS.fraction格局的字符串。(注重,MySQL仍旧不克不及为工夫列存储毫秒“fraction”)上面所示的任一种“宽松”的语法都可以被利用:HH:MM:SS.fraction、HH:MM:SS、HH:MM、DHH:MM:SS、DHH:MM、DHH或SS。这里的D是一个在0-33之间的日期。一个无定界符的HHMMSS格局的字符串,只需字符串看起来像是一个工夫。比方:101112可被了解为10:11:12,可是109712是分歧法的(它有一个偶然义的分钟部分),当被拔出时会转换为00:00:00。一个HHMMSS格局的数字,只需数字看起来像一个工夫。比方,101112可被了解为10:11:12。上面的任一格局都可被一般了解:SS、MMSS、HHMMSS、HHMMSS.fraction。注重,MySQL仍不克不及保留毫秒(fraction)部分。在一个TIME语境中,函数(比方CURRENT_TIME)的前往值将会返一个公道的格局。
关于以字符串指定的包括工夫定界符的TIME值,不用要为小于10的时、分或秒指定2位数字。8:3:2与08:03:02是分歧的。

将“短”的TIME值赋给另外一个TIME列时要分外当心。假如没有冒号,MySQL利用最右位代表秒的假定来注释值。(MySQL将TIME值注释为经由的工夫,而不是时候)。比方,你大概会以为1112and1112的意义就是11:12:00(11点过12分),可是MySQL却将它注释为00:11:12(11分,12秒)。一样的,12和12被注释为00:00:12。有冒号的TIME值,因为冒号的存在,一般以为是处置过的时候。这就是说,11:12就意味着是11:12:00,而不是00:11:12。

假如值超越了TIME的局限,可是别的分、秒部分是正当的,它将被剪切到取值局限的得当端点。比方,-850:00:00和850:00:00将被分离转换为-838:59:59和838:59:59。

分歧法的TIME值将被转换为00:00:00。注重,由于00:00:00本身是一个正当的TIME值,这就没有举措辨别,存储在一个表中的00:00:00,本来的值是不是就是指定为00:00:00或是一个分歧法的值。
6.2.2.4YEAR范例


YEAR范例是一个以1个字节形貌年份的范例。

MySQL以YYYY格局检索和显现一个YEAR值。局限是1901到2155。

能够以多个格局指定YEAR值:
一个在1901到2155局限以内的4位字符串。一个在1901到2155局限以内的4位数字。一个在00到99局限以内的2位字符串。00到69和70到99局限内的值将被分离转换到2000到2069和1970到1999局限内的YEAR值。一个在1到99局限以内的数字。1到69和70到99局限内的值将被分离转换到2001到2069和1970到1999局限内的YEAR值。注重,两位数字的局限与两位字符串的局限稍稍有点分歧,由于你不克不及间接地以数字指定一个零值,将它注释为2000。你必需以一个0或00格局的字符串指定它,不然它将被注释为0000。在一个YEAR的语境中,函数(比方NOW())的前往值将会前往一个公道的格局。
分歧法的YEAR值将被转换为0000。
6.2.3字符串范例




字符串范例有CHAR、VARCHAR、BLOB、TEXT、ENUM和SET。这个章节形貌这些范例是怎样事情的,它们的存储需求,和在你的查询中怎样利用它们。
范例最年夜尺寸字节TINYTEXT或TINYBLOB2^8-1255TEXT或BLOB2^16-1(64K-1)65535MEDIUMTEXT或MEDIUMBLOB2^24-1(16M-1)16777215LONGBLOB2^32-1(4G-1)42949672956.2.3.1CHAR和VARCHAR范例
CHAR和VARCHAR范例是很类似的,可是它们被存储与检索的体例有些分歧。

一个CHAR列的长度被流动为你创立表进所声明的长度。长度能够是1和255之间的任一值。(从MySQL3.23以后,CHAR的长度能够是0到255。)当CHAR值被存储时,他们被用空格在右侧弥补到指定长度。当CHAR值被检索时,尾部的空格被截除。

VARCHAR列的值是变长的字符串。你能够声明一个VARCHAR列在1到255,就像对CHAR列一样。但是,与CHAR相反的,VARCHAR值只以所需的字符数存储,另加一个字节存储纪录的长度。值其实不被弥补;相反的,当被存储时,尾部的空格被截除。(这个截除空格体例分歧于ANSISQL规约。)

假如将一个凌驾列最年夜长度的值赋给一个CHAR或VARCHAR列,该值将截断以合适它。

下表经由过程在CHAR(4)和VARCHAR(4)列中存储分歧的字符串的了局显现了两品种型列的分歧:
值CHAR(4)存储需求VARCHAR(4)存储需求4字节1字节abab4字节ab3字节abcdabcd4字节abcd5字节abcdefghabcd4字节abcd5字节
在各类情形下,CHAR(4)和VARCHAR(4)列的检索值均是一样的,由于在CHAR列上检索值的尾部空格会被截除。

CHAR和VARCHAR列值以省略字母巨细写的体例举行排序和对照,除非在表创建时BINARY属性被指定。BINARY属性意味着,该列值依据MySQL服务器正在运转的呆板的ASCII表按次举行字母巨细写敏感的体例排序和对照。BINARY其实不影响该列怎样被存储和检索。

BINARY属性是有粘性的。这就意味着,假如一个被标志为BINARY的列被用于一个表达式中,全部表达式将作为一个BINARY值被对照。

在表创立时,MySQL大概会隐式地改动一个CHAR或VARCHAR列的范例。检察章节6.5.3.1隐式的列界说变更。
6.2.3.2BLOB和TEXT范例


一个BLOB是一个能够保留一可变数目的数据的二进制年夜工具。四个BLOB范例(TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB)之间的分歧仅仅在于他们能保留值的最年夜长度纷歧致。检察章节6.2.6列范例存储需求。

四个TEXT范例(TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT)对应与四个BLOB范例,而且有不异的最年夜长度和存储需求。在BLOB和TEXT范例之间的独一不同就是,对BLOB值是以字母巨细写敏感的体例举行排序和对照的,而对TEXT值以疏忽字母巨细写体例举行排序和对照。换句话说,TEXT是一个疏忽字母巨细写的BLOB。

假如将一个凌驾列范例最年夜长度的值赋给一个BLOB或TEXT列,该值将被截断以顺应它。

在年夜多半方面,能够将一个TEXT列看做是一个你所但愿年夜VARCHAR列。一样的,BLOB列能够看做是一个VARCHARBINARY列。不同就在于:
在MySQL3.23.2和更新的版本中,能够在BLOB和TEXT列上创建索引。而较老版本的MySQL是不撑持的。当BLOBandTEXT列值被存储时,尾部的空格不会被剪切,这与VARCHAR列是纷歧样的。BLOB和TEXT列不成以有DEFAULT值。
MyODBC以LONGVARBINARY界说BLOB值,以LONGVARCHAR界说TEXT值。

由于BLOB和TEXT值能够十分地长,在利用它们时大概会碰到某些限定:
假如但愿在一个BLOB或TEXT列上利用GROUPBY和ORDERBY,必需将该列值转换为一个定长工具。如许做的尺度做法是利用SUBSTRING函数。比方:
mysql>SELECTcommentFROMtbl_name,SUBSTRING(comment,20)ASsubstr->ORDERBYsubstr;
假如你不如许做,只要列值的前max_sort_length个字节用于排序。max_sort_length缺省的值为1024;在启动mysqld服务时,可使用-O选项对它举行变动。能够在一个包括BLOB或TEXT值的表达式长进行分组,经由过程指定列的地位或利用一一般名:
mysql>SELECTid,SUBSTRING(blob_col,1,100)FROMtbl_nameGROUPBY2;mysql>SELECTid,SUBSTRING(blob_col,1,100)ASbFROMtbl_nameGROUPBYb;
一个BLOB或TEXT工具的最年夜尺寸由其范例决意,可是在客户端和服务器之间实践所能传送的最年夜值,是由可用内存总数和通信缓冲区的巨细来决意的。你能够改动报文缓冲区的巨细,但必需在服务器端与客户端同时这么做。检察章节5.5.2调治服务器参数。
注重,每一个BLOB或TEXT值在外部由一个自力分派的工具暗示。这与别的一切的列范例纷歧样,当表被翻开时,它们被按每列分派一次存储。
6.2.3.3ENUM范例


ENUM是一个字符串工具,其值一般选自一个同意值列表中,该列表在表创立时的列规格申明中被明白地枚举。

鄙人列某些情形下,值也能够是空串("")或NULL:
假如将一个有效值拔出一个ENUM(即,一个不在同意值列表中的字符串),空字符串将作为一个特别的毛病值被拔出。现实上,这个字符串有别于一个“一般的”空字符串,由于这个字符串有个数字索引值为0。稍后有更具体形貌。假如一个ENUM被声明为NULL,NULL也是该列的一个正当值,而且该列的缺省值也将为NULL。假如一个ENUM被声明为NOTNULL,该列的缺省值将是该列表所同意值的第一个成员。
每一个列举值均有一个索引值:
在列申明中列表值所同意的成员值被从1入手下手编号。空字符串毛病值的索引值为0。这就意味着,你可使用上面所示的SELECT语句找出被赋于有效ENUM值的纪录行。
mysql>SELECT*FROMtbl_nameWHEREenum_col=0;
NULL值的索引值为NULL。
比方,指定为ENUM("one","two","three")的一个列,能够有上面所显现的任一值。每一个值的索引值也以下所示:
值索引值NULLNULL""0"one"1"two"2"three"3
换个列举最年夜能够有65535个成员值。

从MySQL3.23.51入手下手,当表被创立时,ENUM值尾部的空格将会主动删除。

当为一个ENUM列赋值时,字母的巨细写是可有可无的。但是,今后从列中检索出来的值的巨细写倒是婚配于创立表时所指定的同意值。

假如在一个数字语境中检索一个ENUM,列值的索引值将被前往。比方,你能够像如许利用数字值检索一个ENUM列:

mysql>SELECTenum_col+0FROMtbl_name;

假如将一个数字存储到一个ENUM中,数字被看成为一个索引值,而且存储的值是该索引值所对应的列举成员。(可是,这在LOADDATA将不克不及事情,由于它视一切的输出均为字符串。)在一个ENUM字符串中存储数字是不明智的,由于它大概会打乱头脑。

ENUM值按照列规格申明中的列表按次举行排序。(换句话说,ENUM值按照它们的索引号排序。)举例来讲,关于ENUM("a","b")"a"排在"b"后,可是关于ENUM("b","a"),"b"却排在"a"之前。空字符串排在非空字符串前,NULL值排在别的一切的列举值前。为了避免意想不到的了局,倡议按照字母的按次界说ENUM列表。也能够经由过程利用GROUPBYCONCAT(col)来断定该以字母按次排序而不是以索引值。

假如但愿失掉一个ENUM列的一切大概值,可使用SHOWCOLUMNSFROMtable_nameLIKEenum_column_name并剖析第二列的ENUM界说。
6.2.3.4SET范例


SET是一个字符串工具,它能够有0或更多个值,每一个值均必需选自一个同意值列表中,该列表在表创立时被指定。包括多个汇合成员的SET列值,由逗号(“,”)将各成员分开。由此推论,SET成员值本身不该该包括逗号。

比方,一个指定为SET("one","two")NOTNULL的列能够有以下任一值:

"""one""two""one,two"

一个SET最年夜能够有64个分歧的成员。

从3.23.51入手下手,当表被创立时,SET值尾部的空格将被主动地删除。

MySQL以数字值存储SET值,以被存储值的低阶比特位(bit)对应于第一个汇合成员。假如在一个数字语境中检索一个SET值,检索的值把比特位设置为对应构成列值的汇合成员。比方,你可使用上面所示的示例从一个SET列中检索出一个数字:

mysql>SELECTset_col+0FROMtbl_name;

假如将一个数字存储到一个SET列中,被设置的数字的二进制暗示法的比特位决意列值中的汇合成员。假定一个列被界说为SET("a","b","c","d")。那末它的成员有上面所示的比特值:
SET成员十进制值二进制值a10001b20010c40100d81000
假如将值9(二进制的1001)赋给这个列,那末SET值的第一个和第四个成员"a"和"d"被选择,了局值为"a,d"。

关于包括凌驾一个SET成员的值,当你拔出值时,无所谓以甚么按次列出成员。也无所谓给出的值被枚举了几次。当今后检索该值时,在值中的每一个成员将呈现一次,依据他们在表创立时所指定的按次列出成员。比方,假如一个列被界说为SET("a","b","c","d"),那末,"a,d"、"d,a"和"d,a,a,d,d"在被检索时均将被视为"a,d"。

假如将一个不撑持的值赋于一个SET列,该值将被疏忽。

SET以数字按次排序。NULL值排在非NULLSET值之前。

一般,可使用LIKE操纵符或FIND_IN_SET()函数实行在一个SET列上的SELECT:

mysql>SELECT*FROMtbl_nameWHEREset_colLIKE%value%;mysql>SELECT*FROMtbl_nameWHEREFIND_IN_SET(value,set_col)>0;

可是,以下示例也能够事情:

mysql>SELECT*FROMtbl_nameWHEREset_col=val1,val2;mysql>SELECT*FROMtbl_nameWHEREset_col&1;

第一个语句寻觅一个准确的婚配。第二个语句寻觅包括第一个汇合成员的值。

假如但愿失掉一个SET列的一切大概值,可使用SHOWCOLUMNSFROMtable_nameLIKEset_column_name并剖析第二列的SET界说。
6.2.4为列选择准确的范例


为了更无效地利用存储空间,在任何情形下均实验利用最准确的范例。比方,假如一个整数列被用于在1和99999之间的值,MEDIUMINTUNSIGNED是最好的范例。

准确地暗示泉币值是一个罕见的成绩。在MySQL中,可使用DECIMAL范例。它是作为一个字符串存储的,因此不会产生精度丧失的情形。假如精度不是太主要的,那DOUBLE范例也是一个不错的选择。

关于高精度,老是能转换一个存储在BIGINT中的定点范例。这将同意你以整型举行任何的盘算,并在需要的时分将了局转换回浮点值。
6.2.5利用来自别的的数据库引擎的列范例


为了更简单地利用为别的供给商的SQL完成而编写的代码,MySQL以下表所示的情势映照列范例。这些映照使得从别的数据库引擎挪动表到MySQL更简单:
别的供应商的范例MySQL范例BINARY(NUM)CHAR(NUM)BINARYCHARVARYING(NUM)VARCHAR(NUM)FLOAT4FLOATFLOAT8DOUBLEINT1TINYINTINT2SMALLINTINT3MEDIUMINTINT4INTINT8BIGINTLONGVARBINARYMEDIUMBLOBLONGVARCHARMEDIUMTEXTMIDDLEINTMEDIUMINTVARBINARY(NUM)VARCHAR(NUM)BINARY
列范例映照在表创立时产生。假如你利用别的供给商利用的范例创立一个表,然后收回一个DESCRIBEtbl_name语句,MySQL将利用相称价的MySQL范例呈报表布局。
6.2.6列范例存储需求


每一个由MySQL撑持的列范例的存储需求按范例鄙人面列出。


6.2.6.1数字范例存储需求列范例存储需求TINYINT1字节SMALLINT2字节MEDIUMINT3字节INT4字节INTEGER4字节BIGINT8字节FLOAT(X)4ifX<=24or8,if25<=X<=53FLOAT4字节DOUBLE8字节DOUBLEPRECISION8字节REAL8字节DECIMAL(M,D)M+2字节ifD>0,M+1字节ifD=0(D+2,ifM<D)NUMERIC(M,D)M+2字节ifD>0,M+1字节ifD=0(D+2,ifM<D)

6.2.6.2日期和工夫范例存储需求列范例存储需求DATE3字节DATETIME8字节TIMESTAMP4字节TIME3字节YEAR1字节6.2.6.3字符串范例存储需求列范例存储需求CHAR(M)M字节,1<=M<=255VARCHAR(M)L+1字节,whereL<=Mand1<=M<=255TINYBLOB,TINYTEXTL+1字节,whereL<2^8BLOB,TEXTL+2字节,whereL<2^16MEDIUMBLOB,MEDIUMTEXTL+3字节,whereL<2^24LONGBLOB,LONGTEXTL+4字节,whereL<2^32ENUM(value1,value2,...)1or2字节,取决于列举值的数目(最年夜值为65535)SET(value1,value2,...)1,2,3,4or8字节,取决于汇合成员数目(最年夜64个成员)
VARCHAR和BLOB和TEXT范例是变长的范例,其存储需求取决于列值的实践长度(上表中以L暗示),而不是取决于范例的最年夜大概尺寸。比方,一个VARCHAR(10)列能够保留最年夜长度为10个字符的字符串。实践存储需求为字符串长度(L),再加上1个字节用于纪录该字符串的长度。关于字符串abcd,L为4,它的存储需求为5字节。

BLOB和TEXT范例必要1、2、3或4字节纪录列值的长度,这取决于该范例的最年夜大概长度。检察章节6.2.3.2BLOB和TEXT范例。

假如一个表包括任何变长范例的列范例,纪录格局也将是变长的。注重,当一个表被创立时,在某种情形下,MySQL会将一个列从一个变长范例转换成一个定长范例,或相反的。检察章节6.5.3.1隐式的列界说变更。

一个ENUM工具的巨细取决于分歧列举值的数目。一个字节被用于列举时,最年夜可撑持255个大概值。2个字节被用于列举时,最年夜可撑持到65535个值。检察章节6.2.3.3ENUM范例。

一个SET工具的巨细取决于分歧汇合成员的数目。假如汇合的巨细是N,则工具占用(N+7)/8个字节,四舍五进为1、2、3、4或8个字节。一个SET能够有最多64个成员。检察章节6.2.3.4SET范例。

MyISAM表的纪录行最年夜尺寸为65534字节。每一个BLOB和TEXT列只占用相对这个尺寸中的5-9个字节。
表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。
变相怪杰 该用户已被删除
沙发
发表于 2015-1-19 22:27:55 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
山那边是海 该用户已被删除
板凳
发表于 2015-1-28 13:59:01 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
谁可相欹 该用户已被删除
地板
发表于 2015-2-5 21:44:22 | 只看该作者
另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-13 17:45:51 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
若相依 该用户已被删除
6#
发表于 2015-3-4 01:04:42 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
精灵巫婆 该用户已被删除
7#
发表于 2015-3-11 15:04:51 | 只看该作者
我个人认为就是孜孜不懈的学习
兰色精灵 该用户已被删除
8#
发表于 2015-3-19 00:48:29 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
9#
发表于 2015-3-27 00:07:10 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-3 22:39

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表