|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于现有业务,可以轻松移植到MySQL。当你需要替换掉老的硬件,当你需要削减历史遗留下的老系统的时候,选用MySQL对于财务部门来说更具吸引力。
数据库中的每一个表都是由一个或多个列组成的。在用CREATETABLE语句创立一个表时,要为每列指定一个范例。列的范例比数据范例更加特别,它仅仅是如“数”或“串”如许的通用范例。列的范例准确地形貌了给定表列大概包括的值的品种,如SMALLINT或VARCHAR(32)。
MySQL的列范例是一种手腕,经由过程这类手腕能够形貌一个表列包括甚么范例的值,这又决意了MySQL如何处置这些值。比方,数值值既可用数值也可用串的列范例来寄存,可是依据寄存这些值的范例,MySQL对它们的处置将会有些分歧。每种列范例都有父鎏匦匀缦拢?br>■个中能够寄存甚么范例的值。
■值要占有几空间,和该值是不是是定长的(一切值占不异数目的空间)或可变长的(所占空间量依附于所存储的值)。
■该范例的值如何对照和存储。
■此范例是不是同意NULL值。
■此范例是不是能够索引。
我们将扼要地考查一下MySQL列范例以取得一个总的观点,然后更具体地会商形貌每种列范例的属性。
2.2.1列范例概述
MySQL为除NULL值之外的一切通用数据范例的值都供应了列范例。在列是不是可以包括NULL值被视为一品种型属性的意义上,可以为一切范例都包括NULL属性。MySQL有整数和浮点数值的列范例,如表2-2所示。整数列范例能够有标记也可无标记。有一种特别的属性同意整数列值主动天生,这对必要独一序列或标识号的使用体系来讲长短常有效的。
MySQL串列范例如表2-3所示。串能够寄存任何内容,即便是像图象或声响如许的相对二进制数据也能够寄存。串在举行对照时能够设定是不是辨别巨细写。别的,可对串举行形式婚配(实践上,在MySQL中能够在恣意列范例长进行形式婚配,但最常常举行形式婚配仍是在串范例上)
日期与工夫列范例在表2-4中示出。关于一时值,MySQL供应了日期(有或没偶然间)、工夫和工夫戳(一种同意跟踪对纪录什么时候举行最初变动的特别范例)的范例。并且还供应了一种在不必要完全的日期时无效地暗示年份的范例。
要创立一个表,应利用CREATETABLE语句并指定组成表列的列表。每一个列都有一个名字和范例,和与每一个范例相干的各类属性。上面是创立具有三个分离名为f、c和i的列的表my_table的例子:
界说一个列的语法以下:
个中列名由col_name给出。列名可最多包括64个字符,字符包含字母、数字、下划线及美圆标记。列名能够名字中正当的任何标记(包含数字)开首。但列名不克不及完整由数字构成,由于那样大概使其与数据分不开。MySQL保存诸如SELECT、DELETE和CREATE如许的词,这些词不克不及用做列名。可是函数名(如POS和MIN)是可使用的。
列范例col_type暗示列可存储的特定值。列范例申明符还能暗示寄存在列中的值的最年夜长度。关于某些范例,可用一个数值明白地申明其长度。而别的一些值,其长度由范例名包含。比方,CHAR(10)明白指定了10个字符的长度。而TINYBLOB值隐含最年夜长度为255个字符。有的范例申明符同意指定最年夜的显现宽度(即显现值时利用几个字符)。浮点范例同意指定小数位数,以是能把持浮点数的精度值为几。
能够在列范例以后指定可选的范例申明属性,和指定更多的罕见属性。属性起润色范例的感化,并变动其处置列值的体例,属性有以下范例:
■公用属性用于指定列。比方,UNSIGNED属性只针对整型,而BINARY属性只用于CHAR和VARCHAR。
■通用属性除多数列以外可用于恣意列。能够指定NULL或NOTNULL以暗示某个列是不是可以寄存NULL。还能够用DEFAULTdef_value来暗示在创立一个新行但未明白给出该列的值时,该列可付与值def_value。def_value必需为一个常量;它不克不及是表达式,也不克不及援用其他列。不克不及对BLOB或TEXT列指定缺省值。
假如想给出多个列的公用属性,可按恣意按次指定它们,只需它们跟在列范例以后、通用属性之前便可。相似地,假如必要给出多个通用属性,也可按恣意按次给出它们,只需将它们放在列范例和大概给出的列公用属性以后便可。本节其他部分会商每一个MySQL的列范例,给出界说范例和形貌它们的属性的语法,诸如取值局限和存储需求等。范例申明如在CREATETABLE语句中那样给出。可选的信息由方括号([])给出。如,语MEDIUMINT[(M)]暗示最年夜显现宽度(指定为M)是可选的。另外一方面,关于CHAR(M),有方括号暗示的(M)是必需的。
2.2.2数值列范例
MySQL的数值列范例有两种:
■整型。用于无小数部分的数,如1、43、-3、0或-798432。可对负数暗示的数据利用整数列,如磅的近似数、英寸的近似数,银河系行星的数量、家属人数或一个盘子里的细菌数等。
■浮点数。用于大概具有小数部分的数,如3.14159、-.00273、-4.78、或39.3E+4。可将浮点数列范例用于有小数点部分或极年夜、极小的数。大概会暗示为浮点数的值有农作物均匀产量、间隔、钱数(如物品代价或人为)、就业率或股票代价等等。整型值也可
以付与浮点列,这时候将它们暗示为小数部分为零的浮点值。每种数值范例的称号和取值局限如表2-5所示。各类范例值所需的存储量如表2-6所示。
CREATETABLE语句
本章中例子中大批利用了CREATETABLE语句。您应当对此语句相称熟习,由于我们在第1章中的教程部分利用过它。关于CREATETABLE语句也可参阅附录D。
MySQL供应了五种整型:TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT。INT为INTEGER的缩写。这些范例在可暗示的取值局限上是分歧的。整数列可界说为UNSIGNED从而禁用负值;这使列的取值局限为0以上。各类范例的存储量需求也是分歧的。
取值局限较年夜的范例所需的存储量较年夜。
MySQL供应三种浮点范例:FLOAT、DOUBLE和DECIMAL。与整型分歧,浮点范例不克不及是UNSIGNED的,其取值局限也与整型分歧,这类分歧不但在于这些范例有最年夜值,并且另有最小非零值。最小值供应了响应范例精度的一种器度,这关于纪录迷信数据来讲长短常主要的(固然,也有负的最年夜和最小值)。
DOUBLEPRECISION[(M,D)]和REAL[(M,D)]为DOUBLE[(M,D)]的同义词。而NUMERIC(M,D)为DECIMAL(M,D)的同义词。FLOAT(4)和FLOAT(8)是为了与ODBC兼容而供应的。在MySQL3.23之前,它们为FLOAT(10,2)和DOUBLE(16,4)的同义词。自MySQL3.23以来,FLOAT(4)和FLOAT(8)各不不异,上面还要先容。
在选择了某种数值范例时,应当思索所要暗示的值的局限,只需选择能掩盖要取值的局限的最小范例便可。选择较年夜范例会对空间形成华侈,使表不用要地增年夜,处置起来没有选择较小范例那样无效。关于整型值,假如数据取值局限较小,如职员岁数或兄弟姐妹数,则TINYINT最符合。MEDIUMINT可以暗示数百万的值而且可用于更多范例的值,但存储价值较年夜。BIGINT在全体整型中取值局限最年夜,并且必要的存储空间是暗示局限次年夜的整型INT范例的两倍,因而只在的确必要时才用。关于浮点值,DOUBLE占用FLOAT的两倍空间。除非出格必要高精度或局限极年夜的值,一样平常应利用只用一半存储价值的FLOAT型来暗示数据。
在界说整型列时,能够指定可选的显现尺寸M。假如如许,M应当是一个1到255的整数。它暗示用来显现列中值的字符数。比方,MEDIUMINT(4)指定了一个具有4个字符显现宽度的MEDIUMINT列。假如界说了一个没有明白宽度的整数列,将会主动分派给它一个缺省的宽度。缺省值为每品种型的“最长”值的长度。假如某个特定值的可打印暗示必要不止M个字符,则显现完整的值;不会将值截断以合适M个字符。对每种浮点范例,可指定一个最年夜的显现尺寸M和小数位数D。M的值应当取1到255。D的值可为0到30,可是不该年夜于M-2。(假如熟习ODBC术语,就会晓得M和D对应于
ODBC观点的“精度”和“小数点位数”)M和D对FLOAT和DOUBLE都是可选的,但关于DECIMAL是必需的。在选项M和D时,假如省略了它们,则利用缺省值。上面的语句创立了一个表,它申明了数值列范例的M和D的缺省值(个中不包含DECIMAL,由于M和D对这类范例不是可选的):
假如在创立表以后利用DESCRIBEmy_table语句,则输入的Field和Type列以下所示(注重,假如用MySQL的3.23之前的版本运转这个查询,则有一个小妨碍,即BIGINT的显现宽度将是21而不是20。):
每个数字列都具有一个由列范例所决意的取值局限。假如盘算拔出一个不在列局限内的值,将会举行截取:MySQL将剪裁该值为取值局限的界限值并利用这个了局。在检索时不举行值的剪裁。
值的剪裁依据列范例的局限而不是显现宽度举行。比方,一个SMALLINT(3)列显现宽度为3而取值局限为-32768到32767。值12345比显现宽度年夜,但在该列的取值局限内,因而它能够拔出而不必剪裁而且作为12345检索。值99999超越了取值局限,因而在拔出时被剪裁为32767。今后在检索中将以值32767检索该值。
一样平常付与浮点列的值被四舍五进到这个列所指定的十进制数。假如在一个FLOAT(8,1)的列中存储1.23456,则了局为1.2。假如将不异的值存进FLOAT(8,4)的列中,则了局为1.2346。这暗示应当界说具有充足位数的浮点列以便失掉尽量准确的值。假如想准确到千分之一,那就不要界说使该范例唯一两位小数。
浮点值的这类处置在MySQL3.23中有破例,FLOAT(4)和FLOAT(8)的功能有所变更。这两品种型如今为单精度(4字节)和双精度(8字节)的范例,在其值按给出的情势寄存(只受硬件的限定)这一点上说,这两品种型是真浮点范例。
DECIMAL范例分歧于FLOAT和DECIMAL,个中DECIMAL实践是以串寄存的。DECIMAL大概的最年夜取值局限与DOUBLE一样,可是其无效的取值局限由M和D的值决意。假如改动M而流动D,则其取值局限将随M的变年夜而变年夜。表2-7的前三行申明了这一点。假如流动M而改动D,则其取值局限将随D的变年夜而变小(但精度增添)。表2-7的后三行申明了这一点。
给定的DECIMAL范例的取值局限取决于MySQL的版本。关于MySQL3.23之前的版本,DECIMAL(M,D)列的每一个值占用M字节,而标记(假如必要)和小数点包含在M字节中。因而,范例为DECIMAL(5,2)的列,其取值局限为-9.99到99.99,由于它们掩盖了一切大概的5个字符的值。
正如MySQL3.23一样,DECIMAL值是依据ANSI标准举行处置的,ANSI标准划定DECIMAL(M,D)必需可以暗示M位数字及D位小数的任何值。比方,DECIMAL(5,2)必需可以暗示从-999.99到999.99的一切值。并且必需存储标记和小数点,因而自MySQL3.23以来DECIMAL值占M+2个字节。关于DECIMAL(5,2),“最长”的值(-999.99)必要7个字节。在正取值局限的一端,不必要正号,因而MySQL使用它扩大了取值局限,使其超
过了ANSI所标准所请求的取值局限。如DECIMAL(5,2)的最年夜值为9999.99,由于有7个字节可用。
简而言之,在MySQL3.23及今后的版本中,DECIMAL(M,D)的取值局限即是更早版本中的DECIMAL(M+2,D)的取值局限。在MySQL的一切版本中,假如某个DECIMAL列的D为0,则不存储小数点。如许做的了局是扩大了列的取值局限,由于已往用来存储小数点的字节如今可用来寄存其他数字了。
1.数值列的范例属性
可对一切数值范例指定ZEROFILL属性。它使响应列的显现值用前导零来添补,以到达显现宽度。在但愿断定列值老是以给定的数字位数显现时可使用ZEROFILL。实践上,更正确地说是“一个给定的最小数量的数字位数”,由于比显现宽度更宽的值可完整显现而未被剪裁。利用以下语句可看到这一点:
个中SELECT语句的输入了局以下。请注重最初一行值,它比列的显现宽度更宽,但仍旧完整显现出来:
以下所示两个属性只用于整数列:
■AUTO_INCREMENT。在必要发生独一标识符或按次值时,可使用AUTO_INCREMENT属性。AUTO_INCREMENT值一样平常从1入手下手,每行增添1。在拔出NULL到一个AUTO_INCREMENT列时,MySQL拔出一个比该列中以后最年夜值年夜1的值。一个表中最多只能有一个AUTO_INCREMENT列。关于任何想要利用AUTO_INCREMENT的列,应当界说为NOTNULL,并界说为PRIMARYKEY或界说为UNIQUE键。比方,可按以下任何一种体例界说AUTO_INCREMENT列:
AUTO_INCREMENT的功能将鄙人一大节“利用序列”中作进一步的先容。
■UNSIGNED。此属性禁用负值。将列界说为UNSIGNED其实不改动其基础数据范例的取值局限;它只是前移了取值的局限。思索以下的表申明:
itiny和itiny_u两列都是TINYINT列,而且都可取256个值,可是itiny的取值局限为-128到127,而itiny_u的取值局限为0到255。UNSIGNED对不取负值的列长短常有效的,如存进生齿统计或列席人数的列。假如用惯例的有标记列来存储如许的值,那末就只使用了该列范例取值局限的一半。经由过程使列为UNSIGNED,能无效地成倍增添其取值局限。假如将列用于序列号,且将它设为UNSIGNED,则可取原双倍的值。在指定以上属性以后(它们是专门用于数值列的),能够指定通用属性NULL或NOTNULL。假如未指定NULL或NOTNULL,则缺省为NULL。也能够用DEFAULT属性来指定一个缺省值。假如不指定缺省值,则会主动选择一个。关于一切数值列范例,那些能够包括NULL的列的缺省将为NULL,不克不及包括NULL的列其缺省为0。上面的样例创立三个INT列,它们分离具出缺省值-1、1和NULL:
2.利用序列
很多使用程序出于标识的目标必要利用独一的号码。必要独一值的这类请求在很多场所城市呈现,如:会员号、实验样品编号、主顾ID、毛病呈报或妨碍标签等等。AUTO_INCREMENT列可供应独一编号。这些列可主动天生按次编号。本节形貌AUTO_INCREMENT列是如何起感化的,从而使您可以无效天时用它们而不至于堕落。别的,还先容了如何不必AUTO_INCREMENT列来发生序列的办法。
(1)MySQL3.23之前的版本中的AUTO_INCREMENTMySQL3.23版之前的AUTO_INCREMENT列的功能以下:
■拔出NULL到AUTO_INCREMENT列,使MySQL主动地发生下一个序列号并将此序列号主动地拔出列中。AUTO_INCREMENT序列从1入手下手,因而拔出表中的第一个纪录失掉为1的序列值,尔后继拔出的纪录分离失掉序列值2、3等等。一样平常,每一个主动天生的值都比存储在该列中确当前最年夜值年夜1。
■拔出0到AUTO_INCREMENT与拔出NULL到列中的效果一样。拔出一行而不指定AUTO_INCREMENT列的值也与拔出NULL的效果一样。
■假如拔出一个纪录并明白指定AUTO_INCREMENT列的一个值,将会产生两件事之一。假如已存在具有该值的某个纪录,则堕落,由于AUTO_INCREMENT列中的值必需是唯一的。假如不存在具有该值的纪录,那末新纪录将被拔出,而且假如新纪录的AUTO_INCREMENT列中的值是新的最年夜值,那末后续即将用该值的下一个值。换句话说,也就是能够经由过程拔出一个具有比以后值年夜的序列值的纪录,来增年夜序列的计数器。增年夜计数器会使序列呈现空缺,但这个特征也有效。比方创立一个具有AUTO_INCREMENT列的表,但但愿序列从1000而不是1入手下手。则能够用后述的两种举措之一到达此目标。一个举措是拔出具有明白序列值1000的第一个纪录,然后经由过程拔出NULL到AUTO_INCREMENT列来拔出后续的纪录。另外一个举措是拔出
AUTO_INCREMENT列值为999的假纪录。然后第一个实践拔出的纪录将失掉一个序列号1000,这时候再将假纪录删除。
■假如将一个分歧划定的值拔出AUTO_INCREMENT列,将会呈现难以意料的了局。
■假如删除在AUTO_INCREMENT列中含有最年夜值的纪录,则此值鄙人一次发生新值时会再次利用。假如删除表中的一切纪录,则一切值都能够重用;响应的序列从头从1入手下手。
■REPLACE语句一般起感化。
■UPDATE语句按相似拔出新纪录的划定规矩起感化。假如更新一个AUTO_INCREMENT列为NULL或0,则会主动将其更新为下一个序列号。假如试图更新该列为一个已存在的值,将堕落(除非可巧设置此列的值为它所具有的值,才不会堕落,但这没有任何意义)。假如更新该列的值为一个比以后任何列值都年夜的值,则今后序列将从下一个值持续举行编号。
■比来主动发生的序列编号值可挪用LAST_INSERT_ID()函数失掉。它使得能在其他不晓得此值的语句中援用AUTO_INCREMENT值。LAST_INSERT_ID()依附于以后服务器会话中天生的AUTO_INCREMENT值;它不受与其他客户机相干的AUTO_INCREMENT举动的影响。假如以后会话中没有天生AUTO_INCREMENT值,则LAST_INSERT_ID()前往0。可以主动天生按次编号这个功效出格有效。可是方才先容的AUTO_INCREMENT功能有两个缺点。起首,序列中顶上的纪录被删除时,序列值的重用使得难于天生大概删除和拔出纪录的使用的一系列单调(严厉递增)值。其次,使用从年夜于1的值入手下手天生序列的办法是很笨的。
(2)MySQL3.23版今后的AUTO_INCREMENTMySQL3.23对AUTO_INCREMENT的功能举行了以下变化以便可以处置上述成绩:
■主动按次天生的值严厉递增且不重用。假如最年夜的值为143并删除包括这个值的纪录,MySQL持续天生下一个值144。
■在创立表时,能够明白指定初始的序列编号。上面的例子创立一个AUTO_INCRE-MENT列seq从1,000,000入手下手的表:
在一个表具有多个列时(正如多半表那样),最初的AUTO_INCREMENT=1000000子句使用到哪一列是不会搅浑的,由于每一个表只能有一个AUTO_INCREMENT列。
(3)利用AUTO_INCREMENT应当思索的成绩在利用AUTO_INCREMENT列时,应当记着以下要点:
■AUTO_INCREMENT不是一种列范例,它只是一种列范例属性。别的,AUTO_INCREMENT是一种只能用于整数范例的属性。MySQL早于3.23的版本其实不严厉从命这个束缚,同意界说诸如CHAR如许的列范例具有AUTO_INCREMENT属性。可是只要整数范例作为AUTO_INCREMENT列一般起感化。
■AUTO_INCREMENT机制的次要目标是天生一个正整数序列,而且假如以这类体例利用,则AUTO_INCREMENT列效果最好。以是应当界说AUTO_INCREMENT列为UNSIGNED。如许做的长处是在抵达列范例的取值局限下限前能够举行两倍的序列编号。在某些情况下,也有大概使用AUTO_INCREMENT列来天生负值的序列,可是我们不倡议如许做。假如您决意要试一下,应当包管举行充实的实验,而且在晋级到分歧的MySQL版本时必要从头测试。笔者的履历标明,分歧的版本中,负序列的功能其实不完整分歧。
■不要以为对某个列界说增添AUTO_INCREMENT是一个失掉无穷的编号序列的奇奥办法。现实并不是如许;AUTO_INCREMENT序列受基本列范例的取值局限所限定。比方,假如利用TINYINTUNSIGNED列,则最年夜的序列号为255。在到达这个界线时,使用程序将入手下手呈现“反复键”毛病。
■MySQL3.23引进了不重用序列编号的新AUTO_INCREMENT功能,而且同意在CREATETABLE语句中指定一个初始的序列编号。这些功能在利用以下情势的DELETE语句删除表中一切纪录后能够取消:
在此情况下,序列从头从1入手下手而不按严厉的增量按次持续增添。即便在CREATETABLE语句中明白指定了一个初始的序列编号,响应的序列也会重新入手下手。呈现这类情况的缘故原由在于MySQL优化完整删空一个表的DELETE语句的办法上;它重新入手下手从头创立数据文件和索引文件而不是往删除每一个纪录,如许就丧失了一切的序列号信息。假如要删除一切纪录,但但愿保存序列信息,能够作废优化并强迫MySQL实行逐行的删除操纵,以下所示:
假如利用的是3.23以上的版本,如何坚持严厉的增量序列?办法之一是坚持一个只用来天生AUTO_INCREMENT值的自力的表,永久不从这个表中删除纪录。在这类情形下,自力表中的值永久不会重用。在主表中必要天生一个新纪录时,起首在序列编号表中拔出一个NULL。然后对但愿包括序列编号的列利用LAST_INSERT_ID()的值将该纪录拔出主表,以下所示:
假如想要编写一个天生AUTO_INCREMENT值的使用程序,但但愿序列从100而不是1入手下手。再假定但愿这个程序可移植到一切MySQL版本。如何来完成它呢?假如可移植是一个方针,那末不克不及依附MySQL3.23所供应的在CREATETABLE语句中指定初始序列编号的功效。而是在想要拔出一个纪录时,起首用以下语句反省表是不是是空的:
这个步骤固然是附加的,但不会消费太多的工夫,由于没有WHERE子句的SELECTCOUNT(*)是优化的,前往很快。假如表是空的,则拔出纪录并明白地对序列编号列指定值100。假如表不空,则对序列编号列值指定NULL使MySQL主动天生下一个编号。此办法同意拔出序列编号为100、101等的纪录,它不论MySQL是不是同意指定初始序列值都能一般事情。假如请求序列编号即便是从表中删除纪录后也要严厉递增,则此办法不起感化。在如许的情况下,可将此办法与后面形貌的甚么也不做只是用来发生用于主表的序列编号的帮助表手艺分离利用。为何会但愿从一个年夜于1的序列编号入手下手呢?一个缘故原由是想使一切序列编号全都具有不异的数字位数。假如必要天生主顾ID号,而且但愿不要多于一百万个主顾,则能够从1000000
入手下手编号。在对主顾ID值计数的数字位数改动之前,能够追加一百万个主顾。固然,强迫序列编号为一个流动宽度的另外一个办法是接纳ZEROFILL列。关于有的情况,如许做有大概会出成绩。比方,假如在Perl或PHP剧本中处置具有前导零的序列编号,则必需细心地将它们只作为串利用;假如将它们转换成数字,前导零将会丧失。上面的短Perl剧本申明了处置编号时大概会出的成绩:
打印时,此剧本给出以下输入:
Perl’s‘++’主动增量操纵是很乖巧的并且能够使用串或数值创建序列值,但‘+=’操纵只使用于数值。在所显现的输入中,可看到‘+=’引发串到数值的转换而且丧失了$s值中的前导零。
序列不从1入手下手的另外一个缘故原由从手艺的角度来讲大概何足道哉。比方,在分派会员号时,序列号不要从1入手下手,以避免呈现关于谁是第一号的政治争辩。
(4)不必AUTO_INCREMENT天生序列天生序列号的另外一个办法基本就不必要利用AUTO_INCREMENT列。它使用取一个参数的LAST_INSERT_ID()函数的变量来天生序列号。(这类情势在MySQL3.22.9.中引进)假如使用LAST_INSERT_ID(expr)来拔出或更新一个列,则下一次不必参数挪用LAST_INSERT_ID()时,将前往expr的值。换句话说,就像由AUTO_INCREMENT机制天生的那样对expr举行处置。如许使得能天生一个序列号,然后可在今后的客户会话中使用它,用不着取受其他客户机影响的值。使用这类战略的一种办法是创立一个包括一个值的单行表,该值在想失掉序列中下一个值时举行更新。比方,可创立以下的表:
下面的语句创立了表seq_table并用包括seq值0的行对其举行初始化。可使用这个表发生下一个序列号,以下所示:
该语句掏出seq列确当前值并对其加1,发生序列中的下一个值。使用LAST_INSERT_ID(seq+1)天生新值使它就像一个AUTO_INCREMENT值一样,并且此值可在今后的语句中经由过程挪用无参数的LAST_INSERT_ID()来掏出。即便某个其他客户机同时天生了另外一个序列号,上述感化也不会改动,由于LAST_INSERT_ID()是客户机公用的。假如但愿天生增量不是1的编号序列或负增量的编号序列,也能够使用这个办法。比方,上面两个语句能够用来分离天生一个增量为100的编号序列和一个负的编号序列:
经由过程将seq列设置为响应的初始值,可使用这个办法天生以恣意值入手下手的序列。关于将此序列天生办法用于多个计数器的使用,可参阅第3章。
2.2.3串列范例
MySQL供应了几种寄存字符数据的串范例。串经常用于以下如许的值:
在某种意义上,串实践是一种“通用”范例,由于可用它们来暗示恣意值。比方,可用串范例来存储二进制数据,如影象或声响,大概存储gzip的输入了局,即存储紧缩数据。关于一切串范例,都要剪裁太长的值使其合适于响应的串范例。可是串范例的取值局限很分歧,有的取值局限很小,有的则很年夜。取值年夜的串范例可以存储近4GB的数据。因而,应当使串充足长以避免您的信息被割断(因为受客户机/服务器通讯协定的最年夜块尺寸限定,列
值的最年夜限额为24MB)。
表2-8给出了MySQL界说串值列的范例,和每品种型的最年夜尺寸和存储需求。关于可变长的列范例,各行的值所占的存储量是分歧的,这取决于实践寄存在列中的值的长度。这个长度在表顶用L暗示。
L之外所需的分外字节为寄存该值的长度所需的字节数。MySQL经由过程存储值的内容及其长度来处置可变长度的值。这些分外的字节是无标记整数。请注重,可变长范例的最年夜长度、此范例所需的分外字节数和占用不异字节数的无标记整数之间的对应干系。比方,
MEDIUMBLOB值大概最多224-1字节长并必要3个字节纪录其了局。3个字节的整数范例MEDIUMINT的最年夜无标记值为224-1。这并不是偶尔。
1.CHAR和VARCHAR列范例
CHAR和VARCHAR是最常利用的串范例。它们是有差别的,CHAR是定长范例而VARCHAR是可变长范例。CHAR(M)列中的每一个值占M个字节;短于M个字节的值存储时在右侧加空格(但右侧的空格在检索时往失落)。VARCHAR(M)列的值只用所必须的字节数来寄存(开头的空格在存储时往失落,这与ANSISQL的VARCHAR值的尺度分歧),然后再加一个字节纪录其长度。假如所需的值在长度上变更不年夜,则CHAR是一种比VARCHAR好的选择,由于处置行长度流动的表比处置行长度可变的表的效力更高。假如一切的值长度不异,因为必要分外的字节来纪录值的长度,VARCHAR实践占用了更多的空间。在MySQL3.23之前,CHAR和VARCHAR列用最年夜长度为1到255的M来界说。从MySQL3.23入手下手,CHAR(0)也是正当的了。在但愿界说一个列,但因为尚不晓得其长度,以是不想给其分派空间的情形下,CHAR(0)列作为占位符很有效处。今后能够用ALTERTABLE来加宽这个列。假如同意其为NULL,则CHAR(0)列也能够用来暗示on/off值。如许的列大概取两个值,NULL和空串。CHAR(0)列在表中所占的空间很小,只占一名。除多数情形外,在统一个表中不克不及混用CHAR和VARCHAR。MySQL依据情形乃至会将列从一品种型转换为另外一品种型。如许做的缘故原由以下:
■行定长的表比行可变长的表简单处置(其来由请参阅2.3节“选择列的范例”)。
■表行只在表中一切举动定长范例时是定长的。即便表中只要一列是可变长的,该表的行也是可变长的。
■由于外行可变长时定长行的功能长处完整得到。以是为了节俭存储空间,在这类情形下最好也将定长列转换为可变长列。这暗示,假如表中有VARCHAR列,那末表中不成能同时有CHAR列;MySQL会主动地将它们转换为VARCHAR列。比方创立以下一个表:
请注重,VARCHAR列的呈现使MySQL将c1也转换成了VARCHAR范例。假如试图用ALTERTABLE将c1转换为CHAR,将不起感化。将VARCHAR列转换为CHAR的唯一举措是同时转换表中一切VARCHAR列:
BLOB和TEXT列范例像VARCHAR一样是可变长的,可是它们没有定长的等价范例,因而不克不及在统一表中与BLOB或TEXT列一同利用CHAR列。这时候任何CHAR列都将被转换为VARCHAR列。定长与可变长列混用的情况是在CHAR列短于4个字符时,能够不合错误其举行转换。比方,MySQL不会将上面所创立的表中的CHAR列转换为VARCHAR列:
短于4个字符的列不转换的缘故原由是,均匀情形下,不存储尾空格所节俭的空间被VARCHAR列中纪录每一个值的长度所需的分外字节所抵消了。实践上,假如一切列都短,MySQL将会把所界说的一切列从VARCHAR转换为CHAR。MySQL如许做的缘故原由是,这类转换均匀来讲不会增添存储需求,并且使表行定长,从而改良了功能。假如按以下创立一个表,VARCHAR列全城市转换为CHAR列:
2.BLOB与TEXT列范例
BLOB是一个二进制年夜工具,是一个能够存储大批数据的容器,可使其恣意年夜。在MySQL中,BLOB范例实践是一个范例系列(TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB),除在能够存储的最年夜信息量上分歧外(请参阅表2-8),它们是同等的。
MySQL另有一个TEXT范例系列(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT)。除用于对照和排序外,它们在各个方面都与响应的BLOB范例同等,BLOB值是辨别巨细写的,而TEXT值不辨别巨细写。BLOB和TEXT列关于存储大概有很年夜增加的值或各行巨细有很年夜变更的值很有效,比方,字处置文档、图象和声响、夹杂数据和旧事文章等等。BLOB或TEXT列在MySQL3.23以上版本中能够举行索引,固然在索引时必需指定一个用于索引的束缚尺寸,以避免创建出很年夜的索引项从而抵消索引所带来的优点。除此以外,一样平常欠亨过查找BLOB或TEXT列来举行搜刮,由于如许的列经常包括二进制数据(如图象)。罕见的做法是用表中别的的列来纪录有关BLOB或TEXT值的某种标识信息,并用这些信息来断定想要哪些行。利用BLOB和TEXT列必要出格注重以下几点:
■因为BLOB和TEXT值的巨细变更很年夜,假如举行的删除和更新良多,则存储它们的
表呈现高碎片率会很高。应当按期地运转OPTIMIZETABLE削减碎片率以坚持优秀的
功能。要懂得更具体的信息请参阅第4章。
■假如利用十分年夜的值,大概会必要调剂服务器增添max_allowed_packet参数的值。具体的信息请参阅第11章“惯例的MySQL办理”。假如必要增添但愿利用十分年夜的值的客户机的块尺寸,可见附录E“MySQL程序参考”,该附录先容了如何对mysql和mysqldump客户机举行这类块尺寸的增添。
3.ENUM和SET列范例
ENUM和SET是一种特别的串范例,其列值必需从一个流动的串会合选择。它们之间的次要不同是ENUM列值必需的确是值会合的一个成员,而SET列值能够包含汇合中恣意或一切的成员。换句话说,ENUM用于相互排挤的值,而SET列能够从一个值的列表当选择多个值。
ENUM列范例界说了一个列举。可付与ENUM列一个在创立表时指定的值列表当选择的成员。列举可具有最多65536个成员(个中之一为MySQL保存)。列举一般用来暗示种别值。比方,界说为ENUM(“N”,“Y”)的列中的值能够是“N”或“Y”。大概可将ENUM用于诸如查询拜访或问卷中的多项选择成绩,或用于某个产物的大概尺寸或色彩等:
假如正在处置Web页中的选择,那末能够使用ENUM来暗示站点会见者在某页上的相互排挤的单选钮汇合中举行的选择。比方,假如运转一个在线比萨饼订购服务体系,可用ENUM来暗示主顾订购的比萨饼外形:
假如列举种别暗示计数,在创建该列举时最主要的是选择符合的种别。比方,在纪录实行室查验中白血球的数量时,大概会将计数分为以下的几组:
在某个测试了局以准确的计数抵达时,要依据该值所属的种别来纪录它。但假如想将列从基于种别的ENUM转换为基于准确计数的整数时,不成能恢回复来的计数。在创立SET列时,要指定一个正当的汇合成员列表。在这类意义上,SET范例与ENUM是相似的。可是SET与ENUM分歧,每一个列值可由来自汇合中恣意数量的成员构成。汇合中最多可有64个成员。关于值之间互斥的流动汇合,可以使用SET列范例。比方,可使用SET来暗示汽车的可用选件,以下所示:
然后,特定的SET值将暗示主顾实践订购哪些选件,以下所示:
空串暗示主顾未订购任何选件。这是一个正当的SET值。SET列值为单个串。假如某个值由多个汇合成员构成,那末这些成员在串顶用逗号分开。明显,这暗示不该该用含有逗号的串作为SET成员。SET列的其他用处是暗示诸如病人的诊断或来自Web页的选择了局如许的信息。关于诊断,大概会有一个向病人发问的尺度症状清单,而病人大概会体现出某些症状或一切的症状。关于在线比萨饼服务体系,用于订购的Web页应当具有一组复选框,用来暗示主顾想在比萨饼上加的配料。对ENUM或SET列的正当值列表的界说很主要,比方:
■正如下面所先容的,此列表决意了列的大概正当值。
■可按恣意的巨细写字符拔出ENUM或SET值,可是列界说中指定的串的巨细写字符决意了今后检索它们时的巨细写。比方,假如有一个ENUM(“Y”,“N”)列,但您在个中存储了“y”和“n”,当您检索出它们时显现的是“Y”和“N”。这其实不影响对照或排序的形态,由于ENUM和SET列是不辨别巨细写的。
■在ENUM界说中的值按次就是排序按次。SET界说中的值按次也决意了排序按次,可是这个干系更加庞大,由于列值大概包含多个汇合成员。
■SET界说中的值按次决意了在显现由多个汇合成员构成的SET列值时,子串呈现的按次。
ENUM和SET被回为串范例是因为在创建这些范例的列时,列举和汇合成员被指定为串。可是,这些成员在外部寄存时作为数值,并且一样可作为数值来处置。这暗示ENUM和SET范例比其他的串范例更加无效,由于一般可用数值运算而不是串运算来处置它们。并且这还暗示ENUM和SET值可用在串或数值的情况中。
列界说中的ENUM成员是从1入手下手按次编号的。(0被MySQL用作毛病成员,假如以串的情势暗示就是空串。)列举值的数量决意了ENUM列的存储巨细。一个字节可暗示256个值,两个字节可暗示65536个值。(可将其与一字节和两字节的整数范例TINYINT、
UNSIGNED和SMALLINTUNSIGNED举行对照。)因而,列举成员的最年夜数量为65536(包含毛病成员),而且存储巨细依附于成员数量是不是多于256个。在ENUM界说中,能够最多指定65535(而不是65536)个成员,由于MySQL保存了一个毛病成员,它是每一个列举的隐含成员。在将一个不法值赋给ENUM列时,MySQL主动将其换成毛病成员。上面有一个例子,可用mysql客户机程序测试一下。它给出列举成员的数值按次,并且还申明了NULL值无按次编号:
可对ENUM成员按名大概按编号举行运算,比方:
能够界说空串为一个正当的列举成员。与列在界说中的其他成员一样,它将被付与一个非零的数值。可是利用空串大概会引发某些搅浑,由于该串也被作为数值为0的毛病成员。鄙人面的例子中,将不法的列举值“x”付与ENUM列引发了毛病成员的赋值。仅在以数值
情势举行检索时,才干够与空串辨别开:
SET列的数值暗示与ENUM列的暗示有所分歧,汇合成员不是按次编号的。每一个成员对应SET值中的一个二进制位。第一个汇合成员对应于0位,第二个成员对应于1位,云云等等。数值SET值0对应于空串。SET成员以位值保留。每一个字节的8个汇合值可按此体例存
放,因而SET列的存储巨细是由汇合成员的数量决意的,最多64个成员。关于巨细为1到8、9到16、17到24、25到32、33到64个成员的汇合,其SET值分离占用1、2、3、4或8个字节。
用一组二进制位来暗示SET恰是同意SET值由多个汇合成员构成的缘故原由。值中二进制位的恣意组合都能够失掉,因而,响应的值可由对应于这些二进制位的SET界说中的串组合组成。上面给出一个申明SET列的串情势与数值情势之间干系的样例;数值以十进制情势和二
进制情势分离给出:
假如给SET列付与一个含有未作为汇合成员列出的子串的值,那末这些子串被删除,并将包括其他子串的值付与该列。在赋值给SET列时,子串不必要按界说该列时的按次给出。可是,在今后检索该值时,各成员将按界说时的按次列出。假设用上面的界说界说一个SET列来暗示家具:
假如给这个列付与“chair,couch,table”值,那末,“couch”被保持,由于它不是汇合的成员。其次,今后检索这个值时,显现为“table,chair”。之以是如许是由于MySQL针对所赋的值的每一个子串决意各个二进制位并在存储值时将它们置为1。“couch”不合错误应二进制位,则疏忽。在检索时,MySQL按按次扫描各二进制位,经由过程数值值机关出串值,它主动地将子串排成界说列时给出的按次。这个举措还暗示,假如在一个值中不止一次地指定某个成员,但在检索时它也只会呈现一次。假如将“lamp,lamp,lamp”付与某个SET列,检索时也只会得出“lamp”。MySQL从头对SET值中的成员举行排序这个现实暗示,假如用一个串来搜刮值,则必需以准确的按次列出各成员。假如拔出“chair,table”,然后搜刮“chair,table”,那末将找不到响应的纪录;必需查找“table,chair”才干找到。ENUM和SET列的排序和索引是依据列值的外部值(数值值)举行的。上面的例子大概会显现不准确,由于各个值并非按字母按次存储的:
NULL值排在其他值前(假如是降序,将排在其他值以后)。假如有一个流动的值集,而且但愿按特别的序次举行排序,可使用ENUM的排序按次。在创立表时做一个ENUM列,并在该列的界说中以所想要的序次给出各列举值便可。假如但愿ENUM按一般的字典按次排序,可以使用CONCAT()和排序了局将列转换成一个非ENUM串,以下所示:
4.串列范例属性
可对CHAR和VARCHAR范例指定BINARY属性使列值作为二进制串处置(即,在对照和排序操纵辨别巨细写)。
可对任何串范例指定通用属性NULL和NOTNULL。假如二者都不指定,缺省值为NULL。可是界说某个串列为NOTNULL其实不制止其取空串。空值分歧于漏掉的值,因而,不要毛病地以为能够经由过程界说NOTNULL来强迫某个串列只包括非空的值。假如请求串值非
空,那末这是一个在使用程序中必需强迫实行的束缚前提。
还能够对除BLOB和TEXT范例外的一切串列范例用DEFAULT属性指定一个缺省值。假如不指定缺省值,MySQL会主动选择一个。关于能够包括NULL的列,其缺省值为NULL。关于不克不及包括NULL的列,除ENUM列外都为空串,在ENUM列中,缺省值为第一个列举成员(关于SET范例,在响应的列不克不及包括NULL时其缺省值实践上是空集,不外这里空集等价于空串)。
2.2.4日期和工夫列范例
MySQL供应了几种工夫值的列范例,它们分离是:DATE、DATETIME、TIME、TIMESTAMP和YEAR。表2-9给出了MySQL为界说存储日期和工夫值所供应的这些范例,并给出了每品种型的正当取值局限。YEAR范例是在MySQL3.22版本中引进的。其他范例在一切MySQL版本中都可用。每种工夫范例的存储需求见表2-10。每一个日期和工夫范例都有一个“零”值,在拔出该范例的一个不法值时交换成此值,见表2-11。这个值也是界说为NOTNULL的日期和工夫列的缺省值。
MySQL暗示日期时依据ANSI标准起首给出年份。比方,1999年12月3日暗示为“1999-12-03”。MySQL同意在输出日期
时有某些举动的余地。如能将两个数字的年份转换成四位数字的年份,并且在输出小于10的月份和日期时不必输出后面的那位数字。可是必需起首给出年份。寻常常常利用的那些格局,如“12/3/99”或“3/12/99”,都是不准确的。MySQL利用的日期暗示划定规矩请参阅“处置日期和工夫列”大节。工夫值按当地时区前往给服务器;MySQL对前往给客户机的值不作任什么时候区调剂。
1.DATE、TIME和DATETIME列范例DATE、TIME和DATETIME范例存储日期、工夫和日期和工夫值的组合。其格局为“YYYY-MM-DD”、“hh:mm:ss”和“YYYY-MM-DDhh:mm:ss”。关于DATETIME范例,日期和工夫部分都必要;假如将DATE值赋给DATETIME列,MySQL会主动地追加一个为“00:00:00”的工夫部分。MySQL对DATETIME和TIME暗示的工夫在处置上稍有分歧。关于DATETIME,工夫部分暗示某天的工夫。而TIME值暗示占用的工夫(这也就是为何其取值局限云云之年夜并且同意取负值的缘故原由)。用TIME值的最右侧部分暗示秒,因而,假如拔出一个“短”(不完整)的工夫值,如“12:30”到TIME列,则存储的值为“00:12:30”,即被以为是“12分30秒”。假如乐意,也可用TIME列来暗示天的工夫,可是要记着这个转换划定规矩以避免出成绩。为了拔出一个“12小时30分钟”的值,必需将其暗示为“12:30:00”。
2.TIMESTAMP列范例
TIMESTAMP列以YYYYMMDDhhmmss的格局暗示值,其取值局限从19700101000000到2037年的某个工夫。此取值局限与UNIX的工夫相接洽,在UNIX的工夫中,1970年的第一天为“零天”,也就是所谓的“新纪元”。因而1970年的入手下手决意了TIMESTAMP取值局限的低端。其取值局限的上端对应于UNIX工夫上的四字节界线,它能够暗示到2037年的值。(TIMESTAMP值的下限将会跟着操纵体系为扩大UNIX的工夫值所举行的修正而增添。这是在体系库一级必需说起的。MySQL也将使用这些变动。)TIMESTAMP范例之以是失掉如许的称号是由于它在创立或修正某个纪录时,有特别的纪录感化。假如在一个TIMESTAMP列中拔出NULL,则该列值将主动设置为以后的日期和工夫。在创建或更新一行但不明白给TIMESTAMP列赋值时也会主动设置该列的值为以后的日期和工夫。可是,仅行中的第一个TIMESTAMP列按此体例处置,即便是行中第一个TIMESTAMP列,也能够经由过程拔出一个明白的日期和工夫值到该列(而不是NULL)使该处置生效。
TIMESTAMP列的界说可包括对最年夜显现宽度M的申明。表2-12给出了所同意的M值的显现格局。假如TIMESTAMP界说中省略了M大概其值为0或年夜于14,则该列按TIMESTAMP(14)处置。取值局限从1到13的M奇数值作为下一个更年夜的偶数值处置。TIMESTAMP列的显现宽度与存储巨细或存储在外部的值有关。TIMESTAMP值老是以4字节寄存并按14位精度举行盘算,与显现宽度有关。为了分明这一点,按以下界说一个表,然后拔出一些行,举行检索:
从外表上看,呈现的行排序有误,第一列中的值全都不异,以是仿佛排序是依据第二列中的值举行的。这个外表变态的了局是因为现实上,MySQL是依据拔出TIMESTAMP列的全体14位值举行排序的。MySQL没有可在纪录创建时设置为以后日期和工夫、并今后今后坚持稳定的列范例。假如要完成这一点,可用两种办法来完成:
■利用TIMESTAMP列。在最后创建一个纪录时,设置该列为NULL,将其初始化为以后日期和工夫:
在今后不管什么时候变动此纪录,都要明白地设置此列为其原本的值。付与一个明白的值使工夫戳机制生效,由于它制止了该列的值主动更新:
■利用DATETIME列。在创建纪录时,将该列的值初始化为NOW():
不管今后什么时候更新此纪录,都不克不及动该列:UPDATEtbl_nameSET/*angthingBUTdt_colhere*/WHERE...假如想使用TIMESTAMP列既保留创建的工夫值又保留最初修正的工夫值,那末可用一个TIMESTAMP列来保留修正工夫值,用另外一个TIMESTAMP列保留创建工夫值。要包管保留修正工夫值的列为第一个TIMESTAMP,从而在纪录创建或变动时主动对其举行设置。使保留创建工夫值的列为第二个TIMESTAMP,并在创建新纪录时将其初始化为NOW()。如许第二个TIMESTAMP的值将反应纪录创建工夫,并且今后将不再变动。
3.YEAR列范例
YEAR是一个用来无效地暗示年份值的1个字节的列范例。其取值局限为从1901到2155。在想保留日期信息但又只必要日期的年份时可以使用YEAR范例,如出身年份、当局构造推举年份等等。在不必要完整的日期值时,YEAR比其另日期范例在空间使用上更加无效。
YEAR列的界说可包含显现宽度M的申明,显现宽度应当为4或2。假如YEAR界说中省略了M,其缺省值为4。TINYINT与YEAR具有不异的存储巨细(一个字节),但取值局限分歧。要利用一个整数范例且掩盖与YEAR不异的取值局限,大概必要SMALLINT范例,此范例要占两倍的空间。在所要暗示的年份取值局限与YEAR范例的取值局限不异的情形下,YEAR的空间使用率比SMALLINT更加无效。YEAR绝对整数列的另外一个长处是MySQL将会使用MySQL的年份推想划定规矩把2位值转换为4位值。比方,97与14将转换为1997和2014。但要熟悉到,拔出数值00将失掉0000而不是2000。假如但愿零值转换为2000,必需指定其为串“00”。
4.日期和工夫列范例的属性没有专门针对日期和工夫列范例的属性。通用属性NULL和NOTNULL可用于恣意日期和工夫范例。假如NULL和NOTNULL二者都不指定,则缺省值为NULL。也能够用DEFAULT属性指定一个缺省值。假如不指定缺省值,将主动选择一个缺
省值。含有NULL的列的缺省值为NULL。不然,缺省值为该范例的“零”值。
5.处置日期和工夫列MySQL能够了解各类格局的日期和工夫值。DATE值可按前面的任何一种格局指定,个中包含串和数值情势。表2-13为每种日期和工夫范例所同意的格局。两位数字的年度值的格局用“歧义年份值的注释”中所形貌的划定规矩来注释。关于有分开
符的串格局,纷歧定非要用日期的“-”标记和工夫的“:”标记来分开,任何标点标记都可用作分开符,由于值的注释取决于高低文,而不是取决于分开符。比方,固然工夫通常为用分开符“:”指定的,但MySQL其实不会在一个必要日期的高低文中将含有“:”号的值了解成工夫。别的,关于有分开符的串格局,不必要为小于10的月、日、小时、分钟或秒值指定两个数值。以下值是完整同等的:
请注重,有前导零的值依据它们被指定为串或数有分歧的注释。串“001231”将视为一个六位数字的值并注释为DATE的“2000-12-31”和DATETIME的“2000-12-3100:00:00”。而数001231被以为1231,如许的注释就有成绩了。这类情况最好利用串值,大概假如要利用数值的话,应当用完整限制的值(即,DATE用20001231,DATETIME用200012310000)。一般,在DATE、DATETIME和TIMESTAMP范例之间能够自在地赋值,可是应当记着以下一些限定:
■假如将DATETIME或TIMESTAMP值赋给DATE,则工夫部分被删除。
■假如将DATE值赋给DATETIME或TIMESTAMP,了局值的工夫部分被设置为零。
■各类范例具有分歧的取值局限。TIMESTAMP的取值局限更受限定(1970到2037),因而,例如说,不克不及将1970年之前的DATETIME值赋给TIMESTAMP并失掉公道的了局。也不克不及将2037今后的值赋给TIMESTAMP。MySQL供应了很多处置日期和工夫值的函数。要懂得更具体的信息请参阅附录C。
6.歧义年份值的了解
关于一切包含年份部分的日期和工夫范例(DATE、DATETIME、TIMESTAMP、YEAR),MySQL将两位数字的年份转换为四位数字的年份。这个转换依据以下划定规矩举行(在MySQL4.0中,这些划定规矩稍有修改,个中69将转换为1969而不是2069。这是依据X/OpenUNIX尺度划定的划定规矩作出的修改):
■00到69的年份值转换为2000到2069。
■70到99的年份值转换为1970到1999。
经由过程将分歧的两位数字值赋给一个YEAR列然落后行检索,可很简单地看到这些划定规矩的效果。上面是检索程序:
请注重,00转换为0000而不是2000。这是由于0是YEAR范例的一个完整正当的值;假如拔出一个数值,失掉的就是这个了局。要失掉2000,应当拔出串“0”或“00”。可经由过程CONCAT()拔出YEAR值来包管MySQL失掉一个串而不是数。CONCAT()函数不论其参数是串或数值,都前往一个串了局。请记着,将两位数字的年份值转换为四位数字的年份值的划定规矩只发生一种了局。在未给
定世纪的情形下,MySQL没有举措一定两位数字的年份的寄义。假如MySQL的转换划定规矩不克不及得出您所但愿的值,办理的办法很复杂:即用四位数字输出年份值。MySQL有千年虫成绩吗?MySQL本身是没有2000年成绩的,由于它在外部是按四位数年份存储日期值的,而且由用户卖力供应得当的日期值。两位数字年份注释的实践成绩不是MySQL带来的,而是因为有的人想费事,输出歧义数据所引发的成绩。假如您乐意冒险,能够持续如许做。在您冒险的时分,MySQL的推测划定规矩是可使用的。但要意想到,良多时分您的确必要输出四位数字的年份。比方,president表列出了1700年以来的美国总统,以是在此表中录进出身与出生日期必要四位的年份值。这些列中的年份值跨了好几个世纪,因而,让MySQL从两位数字的年份往推测是哪一个世纪是不成能的。
不可否认,MySQL也是一个很好的关系型数据库,或许在技术上它与其他领先的关系数据库相差并不大,或不具有劣势。但是,对于一些企业环境来说,MySQL显然不具有优势。 |
|