My Sql数据类型.docx_第1页
My Sql数据类型.docx_第2页
My Sql数据类型.docx_第3页
My Sql数据类型.docx_第4页
My Sql数据类型.docx_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

11.1. 列类型概述11.1.1. 数值类型概述11.1.2. 日期和时间类型概述11.1.3. 字符串类型概述11.2. 数值类型11.3. 日期和时间类型11.3.1. DATETIME、DATE和TIMESTAMP类型11.3.2. TIME类型11.3.3. YEAR类型11.3.4. Y2K事宜和日期类型11.4. String类型11.4.1. CHAR和VARCHAR类型11.4.2. BINARY和VARBINARY类型11.4.3. BLOB和TEXT类型11.4.4. ENUM类型11.4.5. SET类型11.5. 列类型存储需求11.6. 选择正确的列类型11.7. 使用来自其他数据库引擎的列类型MySQL支持多种列类型:数值类型、日期/时间类型和字符串(字符)类型。本章首先对这些列类型进行了概述,然后更加详细地描述了各种列的类型,以及列类型存储需求的总结。概述很简单。关于具体列类型的详细信息应查阅详细的描述,例如指定值时允许使用的格式。MySQL支持处理空间数据的扩展名。关于空间类型的信息参见第19章:MySQL中的空间扩展。几种列类型描述使用了下述惯例:M表示最大显示宽度。最大有效显示宽度是255。D适用于浮点和定点类型,并表示小数点后面的位数。最大可能的值是30,但不应大于M-2。方括号(和)表示可选部分。11.1.列类型概述11.1.1. 数值类型概述11.1.2. 日期和时间类型概述11.1.3. 字符串类型概述11.1.1.数值类型概述下面为数值列类型的概述。详细信息参见11.2节,“数值类型”。列存储需求参见11.5节,“列类型存储需求”。M指示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关,相关描述见11.2节,“数值类型”。如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的一个别名。在整数列定义中,SERIAL DEFAULT VALUE是NOT NULL AUTO_INCREMENT UNIQUE的一个别名。警告:应当清楚,当使用在整数值(其中一个是UNSIGNED类型)之间使用减号时,结果是无符号。参见12.8节,“Cast函数和操作符”。BIT(M)位字段类型。M表示每个值的位数,范围为从1到64。如果M被省略, 默认为1。TINYINT(M) UNSIGNED ZEROFILL很小的整数。带符号的范围是-128到127。无符号的范围是0到255。BOOL,BOOLEAN是TINYINT(1)的同义词。zero值被视为假。非zero值视为真。在将来,将根据标准SQL引入完全布尔类型的处理。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列的下述内容:o使用带符号的BIGINT或DOUBLE值进行所有算法,因此除了位函数,不应使用大于9223372036854775807(63位)的无符号的大整数!如果这样做,结果中的最后几位可能出错,这是由于将BIGINT值转换为DOUBLE进行四舍五入时造成的错误。MySQL可以在以下情况下处理BIGINT:当使用整数在一个BIGINT列保存大的无符号的值时。在MIN(col_name)或MAX(col_name)中,其中col_name指BIGINT列。使用操作符(+,-,*等等)并且两个操作数均为整数时。o总是可以使用一个字符串在BIGINT列中保存严格整数值。在这种情况下,MySQL执行字符串-数字转换,其间不存在双精度表示。o当两个操作数均为整数值时,-、+和*操作符使用BIGINT算法。这说明如果乘两个大整数(或来自返回整数的函数),当结果大于9223372036854775807时,会得到意想不到的结果。FLOAT(M,D) UNSIGNED ZEROFILL小(单精度)浮点数。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。M是小数纵位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。如果指定UNSIGNED,不允许负值。使用浮点数可能会遇到意想不到的问题,因为在MySQL中的所有计算用双精度完成。参见A.5.7节,“解决与不匹配行有关的问题”。DOUBLE(M,D) UNSIGNED ZEROFILL普通大小(双精度)浮点数。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到1.7976931348623157E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约15位小数位。如果指定UNSIGNED,不允许负值。DOUBLE PRECISION(M,D) UNSIGNED ZEROFILL,REAL(M,D) UNSIGNED ZEROFILL为DOUBLE的同义词。除了:如果SQL服务器模式包括REAL_AS_FLOAT选项,REAL是FLOAT的同义词而不是DOUBLE的同义词。FLOAT(p) UNSIGNED ZEROFILL浮点数。p表示精度(以位数表示),但MySQL只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。如果p为从0到24,数据类型变为没有M或D值的FLOAT。如果p为从25到53,数据类型变为没有M或D值的DOUBLE。结果列范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。FLOAT(p)语法与ODBC兼容。DECIMAL(M,D) UNSIGNED ZEROFILL压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。小数点和(负数)的-符号不包括在M中。如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。如果D被省略, 默认是0。如果M被省略, 默认是10。如果指定UNSIGNED,不允许负值。所有DECIMAL列的基本计算(+,-,*,/)用65位精度完成。DEC(M,D) UNSIGNED ZEROFILL,NUMERIC(M,D) UNSIGNED ZEROFILL,FIXED(M,D) UNSIGNED ZEROFILL是DECIMAL的同义词。FIXED同义词适用于与其它服务器的兼容性。11.1.2.日期和时间类型概述本节综合讨论了临时列类型。详细信息,参见11.3节,“日期和时间类型”。列存储需求参见11.5节,“列类型存储需求”。DATE日期。支持的范围为1000-01-01到9999-12-31。MySQL以YYYY-MM-DD格式显示DATE值,但允许使用字符串或数字为DATE列分配值。DATETIME日期和时间的组合。支持的范围是1000-01-01 00:00:00到9999-12-31 23:59:59。MySQL以YYYY-MM-DD HH:MM:SS格式显示DATETIME值,但允许使用字符串或数字为DATETIME列分配值。TIMESTAMP(M)时间戳。范围是1970-01-01 00:00:00到2037年。TIMESTAMP列用于INSERT或UPDATE操作时记录日期和时间。如果你不分配一个值,表中的第一个TIMESTAMP列自动设置为最近操作的日期和时间。也可以通过分配一个NULL值,将TIMESTAMP列设置为当前的日期和时间。TIMESTAMP值返回后显示为YYYY-MM-DD HH:MM:SS格式的字符串,显示宽度固定为19个字符。如果想要获得数字值,应在TIMESTAMP列添加+0。注释:MySQL 4.1以前使用的TIMESTAMP格式在MySQL 5.1中不支持;关于旧格式的信息参见MySQL 4.1参考手册。TIME时间。范围是-838:59:59到838:59:59。MySQL以HH:MM:SS格式显示TIME值,但允许使用字符串或数字为TIME列分配值。YEAR(2|4)两位或四位格式的年。默认是四位格式。在四位格式中,允许的值是1901到2155和0000。在两位格式中,允许的值是70到69,表示从1970年到2069年。MySQL以YYYY格式显示YEAR值,但允许使用字符串或数字为YEAR列分配值。11.1.3.字符串类型概述本节综合讨论了字符串列类型。详细信息参见11.4节,“String类型”。列存储需求参见11.5节,“列类型存储需求”。在某些情况中,MySQL可以将一个字符串列更改为不同于CREATE TABLE或ALTER TABLE语句中所给出的类型。参见13.1.5.1节,“沉寂的列规格变更”。MySQL 5.1字符串数据类型包括部分在MySQL 4.1之前的版本中没有的特性:许多字符串数据类型的列定义可以包括指定字符集的CHARACTER SET属性,也可能包括校对规则。(CHARSET是CHARACTER SET的一个同义词)。这些属性适用于CHAR、VARCHAR、TEXT类型、ENUM和SET。例如: CREATE TABLE t ( c1 CHAR(20) CHARACTER SET utf8, c2 CHAR(20) CHARACTER SET latin1 COLLATE latin1_bin );该表定义创建了一个名为c1的列,具有一个utf8字符集和该字符集的默认 校对规则,和一个名为c2的列以及latin1字符集和该字符集的二元 校对规则。二元校对规则对大小写不敏感。MySQL 5.1用字符单位解释在字符列定义中的长度规范。(以前的一些MySQL版本以字节解释长度)。对于CHAR、VARCHAR和TEXT类型,BINARY属性可以为列分配该列字符集的 校对规则。字符列的排序和比较基于分配给列的字符集。在以前的版本中,排序和比较基于服务器字符集的校对规则。对于CHAR和VARCHAR列,你可以用BINARY属性声明列让排序和 校对规则使用当前的字符代码值而不是词汇顺序。关于MySQL 5.1中字符集的支持,参见第10章:字符集支持。NATIONAL CHAR(M) BINARY| ASCII | UNICODE固定长度字符串,当保存时在右侧填充空格以达到指定的长度。M表示列长度。M的范围是0到255个字符。注释:当检索CHAR值时尾部空格被删除。如果想要将某个CHAR的长度设为大于255,执行的CREATE TABLE或ALTER TABLE语句将失败并提示错误:mysql CREATE TABLE c1 (col1 INT, col2 CHAR(500);ERROR 1074 (42000): Column length too big for column col (max = 255); use BLOB or TEXT insteadmysql SHOW CREATE TABLE c1;ERROR 1146 (42S02): Table test.c1 doesnt existCHAR是CHARACTER的简写。NATIONAL CHAR(或其等效短形式NCHAR)是标准的定义CHAR列应使用 默认字符集的SQL方法。这在MySQL中为默认值。BINARY属性是指定列字符集的二元 校对规则的简写。排序和比较基于数值字符值。列类型CHAR BYTE是CHAR BINARY的一个别名。这是为了保证兼容性。可以为CHAR指定ASCII属性。它分配latin1字符集。可以为CHAR指定UNICODE属性。它分配ucs2字符集。MySQL允许创建类型CHAR(0)的列。这主要用于必须有一个列但实际上不使用值的旧版本的应用程序相兼容。当你需要只能取两个值的列时也很好:没有定义为NOT NULL的一个CHAR(0)列只占用一位,只可以取值NULL和(空字符串)。CHAR这是CHAR(1)的同义词。NATIONAL VARCHAR(M) BINARY变长字符串。M表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定。最大有效长度是65,532字节)。注释:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。VARCHAR是字符VARYING的简写。BINARY属性是指定列的字符集的二元 校对规则的简写。排序和比较基于数值字符值。VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。BINARY(M)BINARY类型类似于CHAR类型,但保存二进制字节字符串而不是非二进制字符串。VARBINARY(M)VARBINARY类型类似于VARCHAR类型,但保存二进制字节字符串而不是非二进制字符串。TINYBLOB最大长度为255(281)字节的BLOB列。TINYTEXT最大长度为255(281)字符的TEXT列。BLOB(M)最大长度为65,535(2161)字节的BLOB列。可以给出该类型的可选长度M。如果给出,则MySQL将列创建为最小的但足以容纳M字节长的值的BLOB类型。TEXT(M)最大长度为65,535(2161)字符的TEXT列。可以给出可选长度M。则MySQL将列创建为最小的但足以容纳M字符长的值的TEXT类型。MEDIUMBLOB最大长度为16,777,215(2241)字节的BLOB列。MEDIUMTEXT最大长度为16,777,215(2241)字符的TEXT列。LONGBLOB最大长度为4,294,967,295或4GB(2321)字节的BLOB列。LONGBLOB列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。LONGTEXT最大长度为4,294,967,295或4GB(2321)字符的TEXT列。LONGTEXT列的最大有效(允许的)长度取决于客户端/服务器协议中配置最大包大小和可用的内存。ENUM(value1,value2,.)枚举类型。只能有一个值的字符串,从值列value1,value2,.,NULL中或特殊错误值中选出。ENUM列最多可以有65,535个截然不同的值。ENUM值在内部用整数表示。SET(value1,value2,.)一个设置。字符串对象可以有零个或多个值,每个值必须来自列值value1,value2,.SET列最多可以有64个成员。SET值在内部用整数表示。11.2.数值类型MySQL支持所有标准SQL数值数据类型。这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。BIT数据类型保存位字段值,并且支持MyISAM、MEMORY、InnoDB和BDB表。作为SQL标准的扩展,MySQL也支持整数类型TINYINT、MEDIUMINT和BIGINT。下面的表显示了需要的每个整数类型的存储和范围。类型字节最小值最大值(带符号的/无符号的)(带符号的/无符号的)TINYINT1-1281270255SMALLINT2-3276832767065535MEDIUMINT3-83886088388607016777215INT4-2147483648214748364704294967295BIGINT8-92233720368547758089223372036854775807018446744073709551615MySQL还支持选择在该类型关键字后面的括号内指定整数值的显示宽度(例如,INT(4)。该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度。显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示。当结合可选扩展属性ZEROFILL使用时, 默认补充的空格用零代替。例如,对于声明为INT(5) ZEROFILL的列,值4检索为00004。请注意如果在整数列保存超过显示宽度的一个值,当MySQL为复杂联接生成临时表时会遇到问题,因为在这些情况下MySQL相信数据适合原列宽度。所有整数类型可以有一个可选(非标准)属性UNSIGNED。当你想要在列内只允许非负数和该列需要较大的上限数值范围时可以使用无符号值。浮点和定点类型也可以为UNSIGNED。同数类型,该属性防止负值保存到列中。然而,与整数类型不同的是,列值的上范围保持不变。如果为一个数值列指定ZEROFILL,MySQL自动为该列添加UNSIGNED属性。对于浮点列类型,在MySQL中单精度值使用4个字节,双精度值使用8个字节。FLOAT类型用于表示近似数值数据类型。SQL标准允许在关键字FLOAT后面的括号内选择用位指定精度(但不能为指数范围)。MySQL还支持可选的只用于确定存储大小的精度规定。0到23的精度对应FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。MySQL允许使用非标准语法:FLOAT(M,D)或REAL(M,D)或DOUBLE PRECISION(M,D)。这里,“(M,D)”表示该值一共显示M位整数,其中D位位于小数点后面。例如,定义为FLOAT(7,4)的一个列可以显示为-999.9999。MySQL保存值时进行四舍五入,因此如果在FLOAT(7,4)列内插入999.00009,近似结果是999.0001。MySQL将DOUBLE视为DOUBLE PRECISION(非标准扩展)的同义词。MySQL还将REAL视为DOUBLE PRECISION(非标准扩展)的同义词,除非SQL服务器模式包括REAL_AS_FLOAT选项。为了保证最大可能的可移植性,需要使用近似数值数据值存储的代码应使用FLOAT或DOUBLE PRECISION,不规定精度或位数。DECIMAL和NUMERIC类型在MySQL中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度;例如:salary DECIMAL(5,2)在该例子中,5是精度,2是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。在MySQL 5.1中以二进制格式保存DECIMAL和NUMERIC值。标准SQL要求salary列能够用5位整数位和两位小数保存任何值。因此,在这种情况下可以保存在salary列的值的范围是从-999.99到999.99。在标准SQL中,语法DECIMAL(M)等价于DECIMAL(M,0)。同样,语法DECIMAL等价于DECIMAL(M,0),可以通过计算确定M的值。在MySQL 5.1中支持DECIMAL和NUMERIC数据类型的变量形式。M默认值是10。DECIMAL或NUMERIC的最大位数是65,但具体的DECIMAL或NUMERIC列的实际范围受具体列的精度或标度约束。如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与操作系统有关,但一般结果均被截取到允许的位数)。BIT数据类型可用来保存位字段值。BIT(M)类型允许存储M位值。M范围为1到64。要指定位值,可以使用bvalue符。value是一个用0和1编写的二进制值。例如,b111和b100000000分别表示7和128。参见9.1.5节,“位字段值”。如果为BIT(M)列分配的值的长度小于M位,在值的左边用0填充。例如,为BIT(6)列分配一个值b101,其效果与分配b000101相同。当要在一个数值列内保存一个超出该列允许范围的值时,MySQL的操作取决于此时有效的SQL模式。如果模式未设置,MySQL将值裁剪到范围的相应端点,并保存裁减好的值。但是,如果模式设置为traditional(“严格模式”),超出范围的值将被拒绝并提示错误,并且根据SQL标准插入会失败。参见5.3.2节,“SQL服务器模式”。如果INT列是UNSIGNED,列范围的大小相同,但其端点会变为到0和4294967295。如果你试图保存-9999999999和9999999999,以非严格模式保存到列中的值是0和4294967296。如果在浮点或定点列中分配的值超过指定(或默认)精度和标度规定的范围,MySQL以非严格模式保存表示范围相应端点的值。当MySQL没有工作在严格模式时,对于ALTER TABLE、LOAD DATA INFILE、UPDATE和多行INSERT语句,由于裁剪发生的转换将报告为警告。当MySQL工作在严格模式时,这些语句将失败,并且部分或全部值不会插入或更改,取决于是否表为事务表和其它因素。详情参见5.3.2节,“SQL服务器模式”。11.3.日期和时间类型11.3.1. DATETIME、DATE和TIMESTAMP类型11.3.2. TIME类型11.3.3. YEAR类型11.3.4. Y2K事宜和日期类型表示时间值的DATE和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值。TIMESTAMP类型有专有的自动更新特性,将在后面描述。如果试图插入一个不合法的日期,MySQL将给出警告或错误。可以使用ALLOW_INVALID_DATES SQL模式让MySQL接受某些日期,例如1999-11-31。当你想要保存一个“可能错误的”用户已经在数据库中指定(例如,以web形式)用于将来处理的值时很有用。在这种模式下,MySQL只验证月范围为从0到12,日范围为从0到31。这些范围可以包括零,因为MySQL允许在DATE或DATETIME列保存日/月和日是零的日期。这在应用程序需要保存一个你不知道确切日期的生日时非常有用。在这种情况下,只需要将日期保存为1999-00-00或1999-01-00。如果保存此类日期,DATE_SUB()或DATE_ADD等需要完整日期的函数不会得到正确的结果。(如果你不想在日期中出现零,可以使用NO_ZERO_IN_DATESQL模式)。MySQL还允许将0000-00-00保存为“伪日期”(如果不使用NO_ZERO_DATESQL模式)。这在某些情况下比使用NULL值更方便(并且数据和索引占用的空间更小)。将sql_mode系统变量设置为相应模式值,可以更确切你想让MySQL支持哪种日期。参见5.3.2节,“SQL服务器模式”。当使用日期和时间类型时应记住以下几点:MySQL以标准输出格式检索给定日期或时间类型的值,但它尽力解释你指定的各种输入值格式(例如,当你指定一个分配给或与日期或时间类型进行比较的值时)。只支持下面章节中描述的格式。期望你能提供有效值。如果你使用其它格式的值会发生意想不到的结果。包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值:o70-99范围的年值转换为1970-1999。o00-69范围的年值转换为2000-2069。尽管MySQL尝试解释几种格式的值,日期总是以年-月-日顺序(例如,98-09-04),而不是其它地方常用的月-日-年或日-月-年顺序(例如,09-04-98,04-09-98)。如果值用于数值上下文中,MySQL自动将日期或时间类型的值转换为数字,反之亦然。当MySQL遇到一个日期或时间类型的超出范围或对于该类型不合法的值时(如本节开始所描述),它将该值转换为该类的“零”值。一个例外是超出范围的TIME值被裁剪到TIME范围的相应端点。下面的表显示了各类“零”值的格式。请注意如果启用NO_ZERO_DATESQL模式,使用这些值会产生警告。列类型“零”值DATETIME0000-00-00 00:00:00DATE0000-00-00TIMESTAMP00000000000000TIME00:00:00YEAR0000“零”值是特殊值,但你可以使用表内显示的值显式保存或引用它们。你也可以使用值0或0来保存或引用,写起来更容易。MyODBC中使用的“零”日期或时间值在MyODBC 2.50.12和以上版本中被自动转换为NULL,因为ODBC不能处理此类值。11.3.1.DATETIME、DATE和TIMESTAMP类型11.3.1.1. 自MySQL 4.1以来的TIMESTAMP属性DATETIME、DATE和TIMESTAMP类型是相关的。该节描述了它们的特征,它们的相似点和不同点。当你需要同时包含日期和时间信息的值时则使用DATETIME类型。MySQL以YYYY-MM-DD HH:MM:SS格式检索和显示DATETIME值。支持的范围为1000-01-01 00:00:00到9999-12-31 23:59:59。(“支持”表示尽管先前的值可能工作,但没有保证)。当你只需要日期值而不需要时间部分时应使用DATE类型。MySQL用YYYY-MM-DD格式检索和显示DATE值。支持的范围是1000-01-01到9999-12-31。TIMESTAMP列类型的属性不固定,取决于MySQL版本和服务器运行的SQL模式。这些属性将在本节后面描述。可以使用任何常见格式指定DATETIME、DATE和TIMESTAMP值:YYYY-MM-DD HH:MM:SS或YY-MM-DD HH:MM:SS格式的字符串。允许“不严格”语法:任何标点符都可以用做日期部分或时间部分之间的间割符。例如,98-12-31 11:30:45、98.12.31 11+30+45、98/12/31 11*30*45和981231 113045是等价的。YYYY-MM-DD或YY-MM-DD格式的字符串。这里也允许使用“不严格的”语法。例如,98-12-31、98.12.31、98/12/31和981231是等价的。YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,19970523091528和970523091528被解释为1997-05-23 09:15:28,但971122129015是不合法的(它有一个没有意义的分钟部分),将变为0000-00-00 00:00:00。YYYYMMDD或YYMMDD格式的没有间割符的字符串,假定字符串对于日期类型是有意义的。例如,19970523和970523被解释为1997-05-23,但971332是不合法的(它有一个没有意义的月和日部分),将变为0000-00-00。YYYYMMDDHHMMSS或YYMMDDHHMMSS格式的数字,假定数字对于日期类型是有意义的。例如,19830905132800和830905132800被解释为1983-09-05 13:28:00。YYYYMMDD或YYMMDD格式的数字,假定数字对于日期类型是有意义的。例如,19830905和830905被解释为1983-09-05。函数返回的结果,其值适合DATETIME、DATE或者TIMESTAMP上下文,例如NOW()或CURRENT_DATE。无效DATETIME、DATE或者TIMESTAMP值被转换为相应类型的“零”值(0000-00-00 00:00:00、0000-00-00或者00000000000000)。对于包括日期部分间割符的字符串值,如果日和月的值小于10,不需要指定两位数。1979-6-9与1979-06-09是相同的。同样,对于包括时间部分间割符的字符串值,如果时、分和秒的值小于10,不需要指定两位数。1979-10-30 1:2:3与1979-10-30 01:02:03相同。数字值应为6、8、12或者14位长。如果一个数值是8或14位长,则假定为YYYYMMDD或YYYYMMDDHHMMSS格式,前4位数表示年。如果数字 是6或12位长,则假定为YYMMDD或YYMMDDHHMMSS格式,前2位数表示年。其它数字被解释为仿佛用零填充到了最近的长度。指定为非限定符字符串的值使用给定的长度进行解释。如果字符串为8或14字符长,前4位数表示年。否则,前2位数表示年。从左向右解释字符串内出现的各部分,以发现年、月、日、小时、分和秒值。这说明不应使用少于6字符的字符串。例如,如果你指定9903,认为它表示1999年3月,MySQL将在你的表内插入一个“零”日期值。这是因为年和月值是99和03,但日部分完全丢失,因此该值不是一个合法的日期。但是,可以明显指定一个零值来代表缺少的月或日部分。例如,可以使用990300来插入值1999-03-00。在一定程度上,可以将一个日期类型的值分配给一个不同的日期类型。但是,值可能会更改或丢失一些信息:如果你为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的时间部分被设置为00:00:00,因为DATE值未包含时间信息。如果你为一个DATE对象分配一个DATETIME或TIMESTAMP值,结果值的时间部分被删除,因为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服务器只对日期的合法性进行基本检查:年、月和日的范围分别是1000到9999、00到12和00到31。任何包含超出这些范围的部分的日期被转换成0000-00-00。请注意仍然允许你保存非法日期,例如2002-04-31。要想确保不使用严格模式时日期有效,应检查应用程序。在严格模式,非法日期不被接受,并且不转换。详细信息参见5.3.2节,“SQL服务器模式”。包含两位年值的日期会令人模糊,因为世纪不知道。MySQL使用以下规则解释两位年值:o00-69范围的年值转换为2000-2069。o70-99范围的年值转换为1970-1999。11.3.1.1.自MySQL 4.1以来的TIMESTAMP属性注释:在旧版本的MySQL中(4.1之前),TIMESTAMP列类型的属性在许多方面于本节所描述的大大不同。如果你需要对旧的TIMESTAMP数据进行转化以便在MySQL 5.1中工作,详情请参见MySQL 4.1参考手册。TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。MySQL服务器也可以以MAXDB模式运行。当服务器以该模式运行时,TIMESTAMP与DATETIME相等。也就是说,如果创建表时服务器以MAXDB模式运行,TIMESTAMP列创建为DATETIME列。结果是,该列使用DATETIME显示格式,有相同的值范围,并且没有自动对当前的日期和时间进行初始化或更新。要想启用MAXDB模式,在启动服务器时使用-sql-mode=MAXDB服务器选项或在运行时通过设置全局sql_mode变量将SQL服务器模式设置为MAXDB:mysql SET GLOBAL sql_mode=MAXDB;客户端可以按照下面方法让服务器为它的连接以MAXDB模式运行:mysql SET SESSION sql_mode=MAXDB;MySQL不接受在日或月列包括一个零或包含非法日期值的时间戳值。该规则的唯一例外是特殊值0000-00-00 00:00:00。你可以非常灵便地确定什么时候初始化和更新TIMESTAMP和对哪些列进行初始化和更新:你可以将当前的时间戳指定为默认值和自动更新的值。但只能选择一个,或者两者都不选。(不可能一个列选择一个行为而另一个列选择另一个行为)。你可以指定哪个TIMESTAMP列自动初始化或更新为当前的日期和时间。不再需要为第1个TIMESTAMP列。请注意下面讨论所信息只适用于创建时未启用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列创建为DATETIME列)。控制TIMESTAMP列的初始化和更新的规则如下所示:如果一个表内的第1个TIMESTAMP列指定为一个DEFAULT值,则不能忽略。 默认值可以为CURRENT_TIMESTAMP或常量日期和时间值。DEFAULT NULL与第1个TIMESTAMP列的DEFAULT CURRENT_TIMESTAMP相同。对于其它TIMESTAMP列,DEFAULT NULL被视为DEFAULT 0。表内的任何一个TIMESTAMP列可以设置为自动初始化为当前时间戳和/或更新。在CREATE TABLE语句中,可以用下面的任何一种方式声明第1个TIMESTAMP列:o用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,列为默认值使用当前的时间戳,并且自动更新。o不使用DEFAULT或ON UPDATE子句,与DEFAULT CURRENT_TIMESTAMPON UPDATECURRENT_TIMESTAMP相同。o用DEFAULT CURRENT_TIMESTAMP子句不用ON UPDATE子句,列为默认值使用当前的时间戳但是不自动更新。o不用DEFAULT子句但用ON UPDATE CURRENT_TIMESTAMP子句,列有默认值0并自动更新。o用常量DEFAULT值,列有给出的 默认值。如果列有一个ON UPDATE CURRENT_TIMESTAMP子句,它自动更新,否则不。换句话说,你可以为初始值和自动更新的值使用当前的时间戳,或者其中一个使用,或者两个皆不使用。(例如,你可以指定ON UPDATE来启用自动更新而不让列自动初始化)。在DEFAULT和ON UPDATE子句中可以使用CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()或者NOW()。它们均具有相同的效果。两个属性的顺序并不重要。如果一个TIMESTAMP列同时指定了DEFAULT和ON UPDATE,任何一个可以在另一个的前面。例子,下面这些语句是等效的:CREATE TABLE t (ts TIMESTAMP);CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);要为TIMESTAMP列而不是第1列指定自动默认或更新,必须通过将第1个TIMESTAMP列显式分配一个常量DEFAULT值来禁用自动初始化和更新。(例如,DEFAULT 0或DEFAULT2003-01-01 00:00:00)。然后,对于其它TIMESTAMP列,规则与第1个TIMESTAMP列相同,例外情况是不能忽略DEFAULT和ON UPDATE子句。如果这样做,则不会自动进行初始化或更新。例如:下面这些语句是等效的:CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);CREATE TABLE t ( ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP);可以对每个连接设置当前的时区,相关描述参见5.10.8节,“MySQL服务器时区支持”。TIMESTAMP值以UTC格式保存,存储时对当前的时区进行转换,检索时再转换回当前的时区。只要时区设定值为常量,便可以得到保存时的值。如果保存一个TIMESTAMP值,应更改时区然后检索该值,它与你保存的值不同。这是因为在两个方向的转换中没有使用相同的时区。当前的时区可以用作time_zone系统变量的值。可以在TIMESTAMP列的定义中包括NULL属性以允许列包含NULL值。例如:CREATE TABLE t( ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIME

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论