mysql对无效数据的约束

来源:互联网 发布:网络暴力人肉搜索案例 编辑:程序博客网 时间:2024/06/13 01:10

mysql5.0.2之前,mysql对值的验证并不严格,>=5.0.2后,兼容保留了原来的默认方式,也提供了可选择的验证行为。

 

倘若在不严格模式下进行值的插入,例如NULL插入NOT NULL列中,或将较大值插入,mysql会为这些列设置“最可能的值”,而不是

生成错误的信息而导致数据不能插入.

 

5.0.2之前mysql的处理方式:

1.试图插入数值数据类型范围之外的值的列,mysql服务器将保存0(最小的可能值)或最大的可能只

2.字符串则保存空串或尽可能的保存多的到列中

3.将不是数值类型的数据插入数值列中,mysql将设置为0

4.mysql并不对data和datetime列坚持,如果不在mysql日期类型存储的范围内,mysql用"0000-00-00"取代

5.将NUL值保存到NOT NULL的值的列,对于单行INSERT将会报错,而对于多行INSERT INTO或INSERT INTO...SELECT,mysql会

保存默认数据类型的隐含值,一般情况下:数值类型0,字符串'',日期'zero';

6.如果INSERT语句未指定列值,如果列定义明确有DEFAULT子句,mysql插入默认值,反之没有DEFAULT,mysql同5规则中隐含插入数据类型的隐含值

 

>=5.0.2,可以使用选择更严格的处理方式STRICT_TRANS_TABLESSTRICT_ALL_TABLESSQL

STRICT_TRANS_TABLES处理方式:

1.事务性存储引擎,在任何地方插入违法不合数据将导致语句执行失败并进行事务回滚。

2.非事务性引擎,如果错误出现在插入或更新的第一行,则语句执行失败,则表的记录未变动。而如果是第一行后则不会导致语句执行失败,

将调整插入的数据,并发出告警信息,

 

STRICT_ALL_TABLESSQL更严格模式,对于非事务性与STRICT_TRANS_TABLES不同,事务性的规则相同。STRICT_ALL_TABLESSQL

不管是不是首行后(第一行)出错,错误都会导致语句执行失败。但是这样会出现这样的问题:在出现错误之前的数据行能够正确的被执行后面的则因错误而终止。

为避免以上情况:我们可以选择单行插入或更新,但还是建议用应用程序进行数据类型的有效检验

原创粉丝点击