暂无 |

2 Non-Strict模式

下列是使用「SET」设定「sql_mode」变数的语法:

mysql_18_snap_03

如果没有指定「SESSION」或「GLOBAL」的话,MySQL会把这个设定当成「SESSION」,设定的效果只有一个用户端的连线,并不会影响其它用户端连线的设定。下列的范例设定为「non-strict」模式后,使用「SHOW」或「SELECT」叙述查询设定后的结果:

mysql_18_snap_04

如果你希望将所有用户端都设定为「non-strict」模式,那就要使用「GLOBAL」关键字:

mysql_18_snap_05

设定为「non-strict」模式以后,在执行资料维护时,如果资料完全符合栏位资料型态的规定,那就不会发生任何警告或错误:

mysql_18_snap_06

如果资料库发现不符合栏位规定的资料,它会尽量试着处理这些错误的资料,再把资料储存起来。以下列的范例来说,想要储存到字串型态栏位的值有六个字元,可是「fchar」栏位只能储存三个字元,资料库在「non-strict」模式下,会忽略多余的字元后再储存起来,然后使用警告讯息通知你:

mysql_18_snap_07

在non-strict模式运作时,下列几种情形都有可能会启动自动修正资料的功能:

  • 执行新增或修改叙述,包含INSERT、REPLACE、UPDATE与LOAD DATA INFILE
  • 使用ALTER TABLE修改表格的栏位定义
  • 在栏位定义中使用「DEFAULT」指定栏位的预设值

注:「LOAD DATA INFILE」在「汇入与汇出资料、使用SQL叙述汇入资料」中讨论。

2.1 数值

资料库在「non-strict」模式下,处理数值资料型态会使用比较宽松的方式。以整数型态「TINYINT」来说,如果储存的数值超过规定的范围,资料库会依照下列的方式来处理错误的数值资料:

mysql_18_snap_08

浮点数型态与整数型态一样有规定的范围,如果你在定义浮点数型态栏位时,也设定了长度与小数位数,那就只能储存设定的范围:

mysql_18_snap_09

注:储存小数到整数型态的栏位,或是小数位数超过浮点数型态定义的位数,MySQL会针对小数的部份执行四舍五入,并不会有任何错误或警告。

2.2 列举(ENUM)与集合(SET)

「ENUM」型态只能储存一个规定好的成员资料,以「fenum」栏位来说,它设定了A、B、C三个成员,你也可以使用数值1、2、3表示。在「non-strict」模式下,如果你尝试储存错误的资料,资料库都会储存空的字串「"」,数值为0:

mysql_18_snap_10

「SET」型态可以储存一组规定好的成员资料,以以「fset」栏位来说,它设定了X、Y、Z三个成员。在「non-strict」模式下,如果你尝试储存错误的资料,资料库都会储存空的字串「"」,数值为0;如果指定的成员不正确的话,资料库也会自动忽略它们:

mysql_18_snap_11

注:重复的集合成员不会造成任何错误或警告。例如储存「'X,X,Y,Y,Z,Z'」的值到「fset」栏位,实际储存的是「'X,Y,Z'」。

2.3 字串转换为其它型态

资料库设定为「non-strict」模式的时候,如果你想要储存字串资料到非字串型态的栏位,资料库都会帮你转换为栏位的型态后再储存。如果字串的内容不能转换为栏位的型态,例如想要储存字串「Hello!」到数值型态栏位,资料库会储存下列的预设值,然后产生警告讯息:

栏位型态 预设值 栏位型态 预设值
数值 0 TIMESTAMP '0000-00-00 00:00:00′
DATE '0000-00-00′ YEAR 0000或00
TIME '00:00:00′ ENUM
DATETIME '0000-00-00 00:00:00′ SET

在执行字串转换型态的时候,资料库会使用很宽松的方式,尽量把你的资料储存起来,尤其是字串转换为数值与日期型态:

字串值 fint fdate
'10-10-10′ 10 '2010-10-10′
'007′ 7 '0000-00-00′
'SAM36′ 0 '0000-00-00′
'36SAM' 36 '0000-00-00′
'25-SAM' 25 '0000-00-00′
'12 SAM' 12 '0000-00-00′
'SAM' 0 '0000-00-00′

2.4 NULL与NOT NULL

在规划表格栏位的时候,你会根据需求设定栏位是否可以储存「NULL」值。如果你设定某一个栏位不可以储存「NULL」值,不论在「non-strict」或「strict」模式下,储存「NULL」值的叙述都会发生错误讯息:

mysql_18_snap_12

资料库设定为「non-strict」模式的时候,下列的情况只会产生警告讯息:

mysql_18_snap_13

2.5 Strict模式与IGNORE关键字

你也可以将资料库设定为「strict」模式,在这个模式下,只有在储存字串资料到非字串型态的栏位时,资料库会尝试帮你指定的字串转换为栏位型态;其它任何违反资料型态的问题,资料库不会储存错误的资料,而且会产生错误讯息。

在「strict」模式模式下执行新增与修改时,可以依照需求加入「IGNORE」关键字:

mysql_18_snap_14

0

java教程
php教程
php+mysql教程
ThinkPHP教程
MySQL
C语言
css
javascript
Django教程

发表评论

    评价:
    验证码: 点击我更换图片
    最新评论