马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
DBaaS解决方案可以降低首次投入成本,对于那些小企业来说,他们往往认为内部部署的数据库成本太高,DBaaS的成本和灵活性优势对小企业吸引力更大,他们是云数据库解决方案的重点客户群体。MySQL今朝不撑持列的Default为函数的情势,<Pstyle="TEXT-INDENT:2em">如到达你某列的默许值为以后更新日期与工夫的功效,<Pstyle="TEXT-INDENT:2em">你可使用TIMESTAMP列范例<Pstyle="TEXT-INDENT:2em">上面就具体申明TIMESTAMP列范例: <Pstyle="TEXT-INDENT:2em">TIMESTAMP列范例<Pstyle="TEXT-INDENT:2em">TIMESTAMP值能够从1970的某时的入手下手一向到2037年,精度为一秒,其值作为数字显现。<Pstyle="TEXT-INDENT:2em">TIMESTAMP值显现尺寸的格局以下表所示:<Pstyle="TEXT-INDENT:2em">+---------------+----------------+<Pstyle="TEXT-INDENT:2em">|列范例 |显现格局 |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(14)|YYYYMMDDHHMMSS| <Pstyle="TEXT-INDENT:2em">|TIMESTAMP(12)|YYMMDDHHMMSS |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(10)|YYMMDDHHMM |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(8) |YYYYMMDD |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(6) |YYMMDD |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(4) |YYMM |<Pstyle="TEXT-INDENT:2em">|TIMESTAMP(2) |YY |<Pstyle="TEXT-INDENT:2em">+---------------+----------------+<Pstyle="TEXT-INDENT:2em">“完全”TIMESTAMP格局是14位,但TIMESTAMP列也能够用更短的显现尺寸制造<Pstyle="TEXT-INDENT:2em">最多见的显现尺寸是6、8、12、和14。<Pstyle="TEXT-INDENT:2em">你能够在创立表时指定一个恣意的显现尺寸,可是界说列长为0或比14年夜均会被强迫界说为列长14。<Pstyle="TEXT-INDENT:2em">列长在从1~13局限的奇数值尺寸均被强迫为下一个更年夜的偶数。 <Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">界说字段长度 强迫字段长度<Pstyle="TEXT-INDENT:2em">TIMESTAMP(0)-> TIMESTAMP(14)<Pstyle="TEXT-INDENT:2em">TIMESTAMP(15)-> TIMESTAMP(14)<Pstyle="TEXT-INDENT:2em">TIMESTAMP(1)-> TIMESTAMP(2)<Pstyle="TEXT-INDENT:2em">TIMESTAMP(5)-> TIMESTAMP(6) <Pstyle="TEXT-INDENT:2em">一切的TIMESTAMP列都有一样的存储巨细,<Pstyle="TEXT-INDENT:2em">利用被指定的时代工夫值的完全精度(14位)存储正当的值不思索显现尺寸。<Pstyle="TEXT-INDENT:2em">分歧法的日期,将会被强迫为0存储 <Pstyle="TEXT-INDENT:2em">这有几个含义:<Pstyle="TEXT-INDENT:2em">1、固然你建表时界说了列TIMESTAMP(8),但在你举行数据拔出与更新时TIMESTAMP列实践上保留了14位的数据(包含年代日时分秒),只不外在你举行查询时MySQL前往给你的是8位的年代日数据。假如你利用ALTERTABLE拓宽一个局促的TIMESTAMP列,之前被“潜伏”的信息将被显现。<Pstyle="TEXT-INDENT:2em">2、一样,减少一个TIMESTAMP列不会招致信息得到,除感到上值在显现时,较少的信息被显现出。<Pstyle="TEXT-INDENT:2em">3、只管TIMESTAMP值被存储为完全精度,间接操纵存储值的独一函数是UNIX_TIMESTAMP();因为MySQL前往TIMESTAMP列的列值是进过格局化后的检索的值,这意味着你大概不克不及利用某些函数来操纵TIMESTAMP列(比方HOUR()或SECOND()),除非TIMESTAMP值的相干部分被包括在格局化的值中。比方,一个TIMESTAMP列只要被界说为TIMESTAMP(10)以上时,TIMESTAMP列的HH部分才会被显现,因而在更短的TIMESTAMP值上利用HOUR()会发生一个不成预知的了局。<Pstyle="TEXT-INDENT:2em">4、分歧法TIMESTAMP值被变更到得当范例的“零”值(00000000000000)。(DATETIME,DATE亦然) 你可使用以下语句来考证:<Pstyle="TEXT-INDENT:2em">CREATETABLEtest(idINT(3)UNSIGNEDAUTO_INCREMENT,date1TIMESTAMP(8)PRIMARYKEY(id));<Pstyle="TEXT-INDENT:2em">INSERTINTOtestSETid=1;<Pstyle="TEXT-INDENT:2em">SELECT*FROMtest;<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1 |<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114 |<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">ALTERTABLEtestCHANGEdate1date1TIMESTAMP(14);<Pstyle="TEXT-INDENT:2em">SELECT*FROMtest;<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1 |<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114093723|<Pstyle="TEXT-INDENT:2em">+----+----------------+<Pstyle="TEXT-INDENT:2em">你可使用TIMESTAMP列范例主动地用以后的日期和工夫标志INSERT或UPDATE的操纵。<Pstyle="TEXT-INDENT:2em">假如你有多个TIMESTAMP列,只要第一个主动更新。<Pstyle="TEXT-INDENT:2em">主动更新第一个TIMESTAMP列鄙人列任何前提下产生: <Pstyle="TEXT-INDENT:2em">1、列值没有明白地在一个INSERT或LOADDATAINFILE语句中指定。<Pstyle="TEXT-INDENT:2em">2、列值没有明白地在一个UPDATE语句中指定且别的一些的列改动值。(注重一个UPDATE设置一个列为它已有的值,这将不引发TIMESTAMP列被更新,由于假如你设置一个列为它以后的值,MySQL为了效力而疏忽变动。)<Pstyle="TEXT-INDENT:2em">3、你明白地设定TIMESTAMP列为NULL.<Pstyle="TEXT-INDENT:2em">4、除第一个之外的TIMESTAMP列也能够设置到以后的日期和工夫,只需将列设为NULL,或NOW()。 <Pstyle="TEXT-INDENT:2em">CREATETABLEtest(<Pstyle="TEXT-INDENT:2em">idINT(3)UNSIGNEDAUTO_INCREMENT,<Pstyle="TEXT-INDENT:2em">date1TIMESTAMP(14),<Pstyle="TEXT-INDENT:2em">date2TIMESTAMP(14),<Pstyle="TEXT-INDENT:2em">PRIMARYKEY(id)<Pstyle="TEXT-INDENT:2em">); <Pstyle="TEXT-INDENT:2em">INSERTINTOtest(id,date1,date2)VALUES(1,NULL,NULL);<Pstyle="TEXT-INDENT:2em">INSERTINTOtestSETid=2;<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1 |date2 |<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114093723|20021114093723|<Pstyle="TEXT-INDENT:2em">| 2|20021114093724|00000000000000|+----+----------------+----------------+
<Pstyle="TEXT-INDENT:2em"><Pstyle="TEXT-INDENT:2em">->第一条指令因设date1、date2为NULL,以是date1、date2值均为以后工夫<Pstyle="TEXT-INDENT:2em">第二条指令因没有设date1、date2列值,第一个TIMESTAMP列date1为更新为以后工夫,<Pstyle="TEXT-INDENT:2em">而二个TIMESTAMP列date2因日期分歧法而变成“00000000000000” <Pstyle="TEXT-INDENT:2em">UPDATEtestSETid=3WHEREid=1;<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1 |date2 |<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">| 3|20021114094009|20021114093723|<Pstyle="TEXT-INDENT:2em">| 2|20021114093724|00000000000000|<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">->这条指令没有明白地设定date2的列值,以是第一个TIMESTAMP列date1将被更新为以后工夫 <Pstyle="TEXT-INDENT:2em">UPDATEtestSETid=1,date1=date1,date2=NOW()WHEREid=3;<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">|id|date1 |date2 |<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">| 1|20021114094009|20021114094320|<Pstyle="TEXT-INDENT:2em">| 2|20021114093724|00000000000000|<Pstyle="TEXT-INDENT:2em">+----+----------------+----------------+<Pstyle="TEXT-INDENT:2em">->这条指令因设定date1=date1,以是在更新数据时date1列值其实不会产生改动<Pstyle="TEXT-INDENT:2em">而因设定date2=NOW(),以是在更新数据时date2列值会被更新为以后工夫<Pstyle="TEXT-INDENT:2em">此指令等效为UPDATEtestSETid=1,date1=date1,date2=NULLWHEREid=3; <Pstyle="TEXT-INDENT:2em">因MySQL前往的TIMESTAMP列为数字显现情势,<Pstyle="TEXT-INDENT:2em">你能够用DATE_FROMAT()函数来格局化TIMESTAMP列<Pstyle="TEXT-INDENT:2em">SELECTid,DATE_FORMAT(date1,%Y-%m-%d%H:%i:%s)Asdate1,<Pstyle="TEXT-INDENT:2em">DATE_FORMAT(date2,%Y-%m-%d%H:%i:%s)Asdate2FROMtest;<Pstyle="TEXT-INDENT:2em">+----+---------------------+---------------------+<Pstyle="TEXT-INDENT:2em">|id|date1 |date2 |<Pstyle="TEXT-INDENT:2em">+----+---------------------+---------------------+<Pstyle="TEXT-INDENT:2em">| 1|2002-11-1409:40:09|2002-11-1409:43:20|<Pstyle="TEXT-INDENT:2em">| 2|2002-11-1409:37:24|0000-00-0000:00:00|<Pstyle="TEXT-INDENT:2em">+----+---------------------+---------------------+<Pstyle="TEXT-INDENT:2em">SELECTid,DATE_FORMAT(date1,%Y-%m-%d)Asdate1,<Pstyle="TEXT-INDENT:2em">DATE_FORMAT(date2,%Y-%m-%d)Asdate2FROMtest;<Pstyle="TEXT-INDENT:2em">+----+-------------+-------------+<Pstyle="TEXT-INDENT:2em">|id|date1 |date2 |<Pstyle="TEXT-INDENT:2em">+----+-------------+-------------+<Pstyle="TEXT-INDENT:2em">| 1|2002-11-14 |2002-11-14 |<Pstyle="TEXT-INDENT:2em">| 2|2002-11-14 |0000-00-00 |<Pstyle="TEXT-INDENT:2em">+----+-------------+-------------+ <Pstyle="TEXT-INDENT:2em">在某种水平上,你能够把一种日期范例的值赋给一个分歧的日期范例的工具。<Pstyle="TEXT-INDENT:2em">而特别注重的是:值有大概产生一些改动或信息的丧失: <Pstyle="TEXT-INDENT:2em">1、假如你将一个DATE值赋给一个DATETIME或TIMESTAMP工具,了局值的工夫部分被设置为00:00:00,由于DATE值中不包括偶然间信息。 <Pstyle="TEXT-INDENT:2em">2、假如你将一个DATETIME或TIMESTAMP值赋给一个DATE工具,了局值的工夫部分被删除,由于DATE范例不存储工夫信息。<Pstyle="TEXT-INDENT:2em">3、只管DATETIME,DATE和TIMESTAMP值全都能够用一样的格局集来指定,<Pstyle="TEXT-INDENT:2em">但一切范例不都有一样的值局限。<Pstyle="TEXT-INDENT:2em">比方,TIMESTAMP值不克不及比1970早,也不克不及比2037晚,<Pstyle="TEXT-INDENT:2em">这意味着,一个日期比方1968-01-01,看成为一个DATETIME或DATE值时它是正当的,<Pstyle="TEXT-INDENT:2em">但它不是一个准确TIMESTAMP值!而且假如将如许的一个工具赋值给TIMESTAMP列,它将被变更为0。当指定日期值时,小心某些缺点: <Pstyle="TEXT-INDENT:2em">1、同意作为字符串指定值的宽松格局能被棍骗。比方,,由于“:”分开符的利用,值10:11:12大概看起来像工夫值,可是假如在一个日期中利用,高低文将作为年份被注释成2010-11-12。值10:45:15将被变更到0000-00-00,由于45不是一个正当的月份。 2、以2位数字指定的年值是含混的,由于世纪是未知的。MySQL利用以下划定规矩注释2位年值:在00-69局限的年值被变更到2000-2069。在局限70-99的年值被变更到1970-1999。
不可否认,MySQL也是一个很好的关系型数据库,或许在技术上它与其他领先的关系数据库相差并不大,或不具有劣势。但是,对于一些企业环境来说,MySQL显然不具有优势。 |