MySQL处理数据的基本原则是“垃圾进来,垃圾出去”,通俗一点说就是你传给 MySQL 什么样的数据,它就会存储什么样的数据。如果在存储数据时没有对它们进行验证,那么在把它们检索出来时得到的就不一定是你所期望的内容。

有几种 SQL 模式可以在遇到“非正常”值时抛出错误,如果你对其他数据库管理系统比较熟悉,会发现这种行为和其他的数据库管理系统很像。

下面介绍 MySQL 默认情况下如何处理非正常数据和启用各种 SQL 模式时会对数据处理产生哪些影响。

默认情况下,MySQL 会按照以下规则来处理越界(即超出取值范围)的值和其他非正常值:

  • 对于数值列或 TIME 列,超出合法取值范围的那些值将被截断到取值范围最近的那个端点,并把结果值存储起来。
  • 对于除 TIME 列以外的其他类型列,非法值会被转换成与该类型一致的“零”值。
  • 对于字符串列(不包括 ENUM 或 SET),过长的字符串将被截断到该列的最大长度。
  • 给 ENUM 或 SET 类型列进行赋值时,需要根据列定义里给出的合法取值列表进行。如果把不是枚举成员的值赋给 ENUM列,那么列的值就会变成空字符串。如果把包含非集合成员的子字符串的值赋给 SET 列,那么这些字符串会被清理,剩余的成员才会被赋值给列。

如果在执行增删改查等语句时发生了上述转换,那么 MySQL 会给出警告消息。在执行完其中的某一条语句之后,可以使用 SHOW WARNINGS 语句来查看警告消息的内容。

如果需要在插入或更新数据时执行更严格的检查,那么可以启用以下两种 SQL 模式中的一种:

SET sql_mode = 'STRICT_ALL_TABLES' ;
SET sql_mode = 'STRICT_TRANS_TABLES';

对于支持事务的表,这两种模式都是一样的。如果发现某个值无效或缺失,那么会产生一个错误,并且语句会中止执行,并进行回滚,就像什么事都没发生过一样。

对于不支持事务的表,这两种模式有以下效果。

  1. 对于这两种模式,如果在插入或修改第一个行时,发现某个值无效或缺失,那么结果会产生一个错误,语句会中止执行,就像什么事都未发生过一样。 这跟事务表的行为很相似。

  2. 在用于插入或修改多个行的语句里,如果在第一行之后的某个行出现了错误,那么会出现某些行被修改的情况。这两种模式决定着,这条语句此时此刻是要停止执行,还是要继续执行。

  • 在 STRICT_ALL_TABLES模式下,会抛出一个错误,并且语句会停止执行。因为受该语句影响的许多行都已被修改,所以这将会导致“部分更新”问题。
  • 在 STRICT_TRANS_TABLES 模式下,对于非事务表,MySQL会中止语句的执行。只有这样做,才能达到事务表那样的效果。只有当第一行发生错误时,才能达到这样的效果。如果错误在后面的某个行上,那么就会出现某些行被修改的情况。由于对于非事务表,那些修改是无法撤销的,因此MySQL 会继续执行该语句,以避免出现“部分更新”的问题。它会把所有的无效值转换为与其最接近的合法值。对于缺失的值,MySQL会把该列设置成其数据类型的隐式默认值,

通过以下模式可以对输入的数据进行更加严格的检查:

  • ERROR_ FOR_ DIVISION_ BY_ZERO:在严格模式下,如果遇到以零为除数的情况,它会阻止数值进入数据库。如果不在严格模式下,则会产生一条警告消息,并插入 NULL。
  • NO_ ZERO_ DATE:在严格模式下,它会阻止“零”日期值进入数据库。
  • NO_ ZERO_ IN_ DATE:在严格模式下,它会阻止月或日部分为零的不完整日期值进入数据库。

简单来说,MySQL 的严格模式就是 MySQL 自身对数据进行的严格校验,例如格式、长度、类型等。比如一个整型字段我们写入一个字符串类型的数据,在非严格模式下 MySQL 不会报错。如果定义了 char 或 varchar 类型的字段,当写入或更新的数据超过了定义的长度也不会报错。

虽然我们会在代码中做数据校验,但一般认为非严格模式对于编程来说没有任何好处。MySQL开启严格模式从一定程序上来讲也是对我们代码的一种测试,如果我们没有开启严格模式并且在开发过程中也没有遇到错误,那么在上线或代码移植的时候将有可能出现不兼容的情况,因此在开发过程做最好开启 MySQL 的严格模式。

可通过select @@sql_mode;命令查看当前是严格模式还是非严格模式。

例如,如果想让所有的存储引擎启用严格模式,并对“被零除”错误进行检查,那么可以像下面这样设置 SQL 模式:

SET sql_mode ‘STRICT_ALL_TABLES, ERROR_FOR_DIVISION_BY_ZERO' ;

如果想启用严格模式,以及所有的附加限制,那么最为简单的办法是启用 TRADITIONAL 模式:

SET sql_ mode ‘TRADITIONAL' ;

TRADITIONAL 模式的含义是“启用严格模式,当向 MySQL 数据库插入数据时,进行数据的严格校验,保证错误数据不能插入。用于事务表时,会进行事务的回滚”。

可以选择性地在某些方面弱化严格模式。如果启用了 SQL 的 ALLOW_ INVALID_ DATES 模式,那么MySQL将不会对日期部分做全面检查。相反,它只会要求月份值在 1~12 之间,而天数处于 1~31 之间,即允许像‘2000-02-30’或‘2000-06-31’这样的无效值。

另一个制止错误的办法是在 INSERT 或 UPDATE 语句里使用 IGNORE 关键字。这样那些会因无效值而导致错误的语句,将只会导致警告的出现。这些选项能让你灵活地为你的应用选择正确的有效性检查级别。

23、MySQL如何处理无效数据值相关推荐

  1. 处理丢失和无效的数据值

    1.MYSQL针对无效的值采用了一种"forgiving的方式"即采用与合法值最接近的值插入数据库.例如一个unsigned的列值时,当输入负值是会转换为0插入.可能不会被回滚. ...

  2. java通过jdbc访问mysql,update数据返回值的思考

    java通过jdbc访问mysql,update数据返回值的思考 先不说那么多,把Java代码贴出来吧. public static void main(String[] args) throws I ...

  3. MySQL之误删数据如何处理

    写在前面 在工作中不管是程序bug,运维的失误,等,都有可能导致数据误删除,或者是误操作,此时我们就必须快速的恢复数据,避免对正常业务造成过大的影响,甚至出现事故,本文我们按照如下的几种情况来进行分析 ...

  4. mysql多条数据合并一条之后取出重复值

    mysql多条数据合并一条用,逗号分隔 GROUP_CONCAT(equipment_type) as type mysql多条数据合并一条用,逗号分隔并且去除重复值 GROUP_CONCAT(dis ...

  5. Mysql查询某字段值重复的数据个数

    说明:表:survey_consumer,字段:province ,统计字段:count 语句说明:查询出survey_consumer表中province字段两个及以上相同的数据(没有重复的数据不会 ...

  6. MySQL多行数据合并(单例显示多个值)之GROUP_CONCAT()函数(字符串连接函数)

    MySQL多行数据合并之GROUP_CONCAT函数 一.GROUP_CONCAT函数语法 二.创建表和添加测试数据 1.建表 2.添加测试数据 三.编写测试SQL语句 1.人员信息表(左)和房间信息 ...

  7. php读取mysql数据无法修改时间_php设置mysql查询读取数据的超时时间

    php可以设置mysql查询的超时时间估计大家不知道吧,一般都直接在mysql中进行设置了,下面我们来为各位介绍一下php设置mysql查询读取数据的超时时间吧. 现象:php能通过代理正常连接到my ...

  8. mysql关于时间的面试题,mysql时间设置默认值MySQL常见面试题

    1.limit(选出10 到20 条) select * from students order by id limit 9,10; 2.MySQL 会使用索引的操作符号 =,>,=,betwe ...

  9. 为什么 MySQL 不推荐默认值为 null ?

    作者 | guangsu. 来源 | https://blog.csdn.net/qq_30549099/article/details/107395521 通常能听到的答案是使用了NULL值的列将会 ...

最新文章

  1. 3 html语言是什么,HTML语言剖析(3)
  2. CentOS中无法使用setup命令 -bash:setup: command not found
  3. python3.6和3.7的区别_python3.6和3.7有什么区别
  4. Visinets:一个可以让你的信号通路图动起来的网站!
  5. 004 Spark中的local模式的配置以及测试
  6. 在线html链接提取工具
  7. CCF201412试题
  8. sikuli python java_从命令行运行sikulix 1.1.4 python脚本
  9. 上瘾:如何打造习惯养成中的产品(投资篇)
  10. pytorch自定义Dataset,torch加载自己的numpy数据集,torch-cnn训练numpy进行回归
  11. Session的活化与钝化
  12. YonMaster开发者认证线上赋能培训班定档4月18日
  13. 王者无限火力服务器,王者无限火力2
  14. SQL UNION运算符
  15. JAVA 北京大学GPA计算转换
  16. emlog轩少资源网模板,整站数据源码
  17. 【Android】声音播放截断(骤停)的问题
  18. 架构师知识体系(5)--建立自己的知识体系吧
  19. 条形码和二维码编码解码工具类源码
  20. Linux 系统命令及其使用详解大全 (完整版 )

热门文章

  1. STM32启动文件详解及SystemInit函数分析
  2. 互联网大厂高频重点面试题
  3. Jenkins构建自动化脚本执行无界面解决方法
  4. POJ1195Mobile phones
  5. zabbix查看数据
  6. spring-boot-maven-plugin插件的作用
  7. 随机取6位数字或字母方法
  8. wifi测试相关(iwconfig,WPA Supplicant用法)
  9. EOS资源模型(2)资源使用
  10. 区块链BaaS云服务(37)荷兰Techruption 区块链