MySQL中如何处理非法数据

默认情况下,MySQL按照以下规则处理“数据越界”和其他非正常数据

1、对于数值数据或time数据列,超出合法范围的值将被阶段到最近的取值范围边界;

2、对于字符串数据列(不包括enum、set)太长的字符串将被截断到数据列的最大长度,对于

  ENUM类型数据,MySQL将不合法成员用空字符串代替。如果赋值给某个set数据列包含非法子字符串,那mysql会删除那些子字符串并把剩下的赋值给该数据列

3、对于日期和时间数据列,非法数值会被转换成‘0’值替代

当发生上述情况的时候,MySQL会生成警告, 可使用 show warnings 查看。

4、对于字符串序列,太长的字符串将被截短到数据列的最大长度

如果需要在插入或更新数据时进行更严格的检查,可以启用特殊的SQL MODE;

sql_mode='strict_all_tables,strict_trans_tables'

对于支持事务的表,这两种模式是一样的:如果发现某个值缺失或非法,MySQL将抛出错误,语句会停止运行并回滚。

对于不支持事务的表,这两种模式的效果:

1、如果在插入或修第一个数据行时就发现某个值非法或缺失,那该语句直接抛错,语句停止执行。这个和支持事务的数据表行为时一样的。

2、如果在插入或修改第n个(n>1)数据行时才发现错误,那就会出现下面的情况:

2.1 在strict_all_tables模式下,停止语句执行,存在部分更新的问题

2.2 在strict_trans_tables模式下,MySQL将继续执行该语句避免“部分更新问题”,对每个非法值将其转换为最接近的合法值。

配合严格模式的其他几个SQL模式:

ERROR_FOR_DIVISION_BY_ZERO: 在严格模式下,遇到以0为除数的情况,拒绝插入数据库,(如果不在严格模式下,MYSQL将生成一条告警,并插入NULL值)

NO_ZERO_DATE:在严格模式下,拒绝0日期值进入数据库。

建议采用:strict_trans_tables ERROR_FOR_DIVISION_BY_ZERO

制止错误的另一个办法是在insert或update语句里使用IGNORE关键字,使非法值而导致的错误弱化为一个警告。

本文出自 “技术成就梦想” 博客,请务必保留此出处http://weipengfei.blog.51cto.com/1511707/1173816

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/MySQL/

时间: 2024-12-02 07:12:57

MySQL中如何处理非法数据的相关文章

如何将mysql中读取的数据赋值到一个jsp的变量中

问题描述 如何将mysql中读取的数据赋值到一个jsp的变量中 我希望将更新的数据库中的数据赋值到一个jsp变量中然后传输到jsp内部的js程序中,请问怎么才能 把数据库中的值赋给一个jsp变量中. 解决方案 request.setCharacterEncoding("utf-8"); Class.forName("com.mysql.jdbc.Driver"); Connection conn= DriverManager.getConnection("

select-关于mysql中查询重复数据的疑问

问题描述 关于mysql中查询重复数据的疑问 我有一个表叫做sc. 现在要查询score中有相同分数的信息, 查询的sql语句是 select * from sc where score in (select score from sc group by score having count(score)>1); 我很好奇的是group by的执行顺序是比 having先执行啊, 按道理,执行了之后重复的score值是没有的,怎么还能再用having 来查出count(score)>1 的重复

php-PHP无法在MySQL中查询中文数据

问题描述 PHP无法在MySQL中查询中文数据 跪求大神来回答!我的PHP脚本已经实现了MySQL数据库的链接.但是发现在HTML页面上输入中文查询,显示的是数据库中没有这个信息. 但其实我的MySQL里面有这条中文数据的.网上说的设置utf8,gbkgb2312我都试过了,也没有用. 我的并不是说页面显示中文乱码,而是数据库中无法执行查询中文这一操作.希望大神能帮个忙! 解决方案 $inputData = iconv(""GB2312""UTF-8"&q

MySQL中删除重复数据的简单方法_Mysql

MYSQL里有五百万数据,但大多是重复的,真实的就180万,于是想怎样把这些重复的数据搞出来,在网上找了一圈,好多是用NOT IN这样的代码,这样效率很低,自己琢磨组合了一下,找到一个高效的处理方式,用这个方式,五百万数据,十来分钟就全部去除重复了,请各位参考. 第一步:从500万数据表data_content_152里提取出不重复的字段SFZHM对应的ID字段到TMP3表 create table tmp3 as select min(id) as col1 from data_content

如何保护MySQL 中的重要数据

      在日常的工作中,保护数据免受未授权用户的侵犯是系统管理员特别关心的问题.如果你目前用的是MySQL,就可以使用一些方便的功能来保护系统,来大大减少机密数据被未授权用户访问的风险. 企业最有价值的资产通常是其数据库中的客户或产品信息.因此,在这些企业中,数据库管理的一个重要部分就是保护这些数据免受外部攻击,及修复软/硬件故障. 在大多数情况下,软硬件故障通过数据备份机制来处理.多数数据库都自带有内置的工具自动完成整个过程,所以这方面的工作相对轻松,也不会出错.但麻烦却来自另一面:阻止外

如何保护MySQL中的重要数据

在日常的工作中,保护数据免受未授权用户的侵犯是系统管理员特别关心的问题.如果你目前用的是MySQL,就可以使用一些方便的功能来保护系统,来大大减少机密数据被未授权用户访问的风险. 企业最有价值的资产通常是其数据库中的客户或产品信息.因此,在这些企业中,数据库管理的一个重要部分就是保护这些数据免受外部攻击,及修复软/硬件故障. 在大多数情况下,软硬件故障通过数据备份机制来处理.多数数据库都自带有内置的工具自动完成整个过程,所以这方面的工作相对轻松,也不会出错.但麻烦却来自另一面:阻止外来黑客入侵窃

MySql中启用InnoDB数据引擎的方法

1.存储引擎是什么? Mysql中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不同的功能和能力.通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能.这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型).MySql默认配置了许多不同的存储引擎,可以预先设置或者在MySql服务器中启用. 2.MYSQL支持的数据引擎 MyISAM:默认的MySQL插件式存储引擎,它是

让风险远离 保护MySQL中的重要数据

随着技术的进步,MySQL等开源数据库似乎也开始受到企业的热捧.数据库对于企业的重要性是不言而喻的,其数据库管理的一个重要部分就是保护这些数据免受外部攻击,及修复软/硬件故障.在大多数情况下,软硬件故障通过数据备份机制来处理. 多数数据库都自带有内置的工具自动完成整个过程,所以这方面的工作相对轻松,也不会出错.但麻烦却来自另一面:阻止外来黑客入侵窃取或破坏数据库中的信息.不幸的是,一般没有自动工具解决这一问题:而且,这需要管理员手工设置障碍来阻止黑客,确保公司数据的安全. 不对数据库进行保护的常

超实用--删除MYSQL中指定的数据的全部表

作过的人都知道,重复测试数据库的苦恼. 用法:# Usage: ./script user password dbnane mysql.nixcraft.in ~~~~~~~~~~~~~ #!/bin/bash # 删除mysql中所有表 # 示例: # Usage: ./script user password dbnane # Usage: ./script user password dbnane server-ip # Usage: ./script user password dbna