处理丢失和无效的数据值
1.MYSQL针对无效的值采用了一种“forgiving的方式”即采用与合法值最接近的值插入数据库。例如一个unsigned的列值时,当输入负值是会转换为0插入。可能不会被回滚。
可以通过设定SQL mode通过sql_mode系统变量来执行严格的管理。
默认的情况是slq_mode='',意味着没有限制,使用set sql_mode=' ';
Set sql_mode='STRICT_TRANS_TABLES';
Set sql_mode='STRICT_ALL_TABLES';设置后可以阻止例如越界,null例如指定not null列。
其他的SLQ mode如tranditionnal,能够使严格的模式加上其他的限制在日期检查和除数为0.
insert into t (i) values(43); //MySql执行自动string-to-number转换对于第二天语句
insert into t(i) values('43');
下面的语句也可以执行转换:insert into t(i) values('43x');也会进行转换但是会产生一个警告可以使用strict SQL mode
5.8.1 处理丢失的值
create table t(
i int null,
j int not null,
k int default -1
);
对于这个表
insert into t (i) values(0);
insert into t (i,k) values(1,2);
insert into t (i,k) values(1,2),(3,4);
insert into t values();
最后一个语句表示,空值表示使用默认值对于所有的列。
MySQL处理丢失的值:
1. 列的定义包含DEFAULT语句,如果没有明确的default的语句这个列将采用空值,因此i列有个DEFAULT NULL的定义
2.如果一个列定义没有DEFAULT语句,丢失的值处理取决于SQL 模式是否这个表示是transactional:
2.1如果严格的模式不是有效的,mysql插入没有明确的默认值将产生一个警告
2.2 如果严格模式是有效的,一个错误将发生对于transactional表(和语句产生回滚)。错误发生在非transactional表上,但是部分更新可能导致:如果错误发生在第二行或以后的行,那么前面的行可能已经被插入。
5.8.2 处理无效的值在非严格的模式
一般,mysql将执行类型转换基于限制条件(列定义的)。如下:
1.当你插入和更新列值是如insert replace,update或者load data infile。
2.当你干部列的的定义使用alert table
3.当你指定一个默认值使用default语句时
如果MYsql没有运行在严格模式,他将修正无效的输入值到合法的值和产生警告信息。这些消息经通过show warning语句来展示。
1.Conversion of out-of-range values to in-range values.如果你试图存储一个比最小值还小的值时就存储最小值。如果存储比最大值还大的值时就存储最大的值。
2.String truncation 字符串值太长需要被截断来匹配列。如果你试图存储‘Sakila’到一个char(4)列,mysql存储它作为‘Saki’和抛弃剩余的字符
3.Enumeration 和 set value conversion. 如果值不在Enum定义,mysql将转换他为‘’字符串。如果一个值不在set列,将抛弃这些元素,仍旧保留合法元素。
4.Conversion to data type default。如果你试图存储一个值不能被转换为列数据类型。Mysql经存储不明确的默认值,例如,如果尝试存储‘Sakila’到int 列,mysql存储0.对于日期类型是0000-00-00
5.处理Handling assignment of null to not null columns。分配NULL到非空列取决于是否这个分配发生在一个单行或多行的插入语句。对于一个单行的插入,一个错误发生和语句失败。对于一个多行的插入,mysql分配列的不明确的默认值对于它的数据类型。
使用alert来改变列的数据类型时,将会导致一些列的值改变。如果改变int到tinyint,任何值在tinyint的将被剪切到tinyint的附近。
如果列被改变为not null,那么mysql将会转换null值到这不明确的值
接下的表表明几种字符串值的类被处理转换为date或int数据类型。
5.8.3 处理无效值在严格的模式
输入的值可能是无效的对于下面的原因:
1.对于一个数值或临时的列,一个值坑能越界
2. 对于string可能太长
3.对于enum不在范围,对于set 不包含插入的元素
4.对于not null的列,一个null值肯能插入
在严格的模式,服务器将拒绝越界,有不正确数据类型和丢失列值(对于那些没有default的列)。严格的模式能够使用strict_tans_tables和strict_all_tables
strict_trans_table:能够采用严格的行为对于错误能够回滚或取消没有干嘛表到数据正在进入的状态。如果错误发生对于transactional表,这语句将抛弃和回滚。对于一个non-transactional表,这语句将被抛弃没有改变表如果一个无效的值发生在当行插入或者多行插入的第一行。否则,为了避免部分更新对于non-transactional表,mysql将修正任何无效的值到合法的值然后插入他和产生一个警告。
strict_all_tables:和strict_tans_table相似但是将引发non-transaction表抛弃没有发生在第二行或者之后的多行插入。这意味着一个部分更新可能发生,因为更早插入的语句将已经被插入。
5.8.4 Enabling additional input data restrictions
可能的模式可以使用:
1. Divison by zero 使用ERRO_FOR_DIVISION_BY_ZERO值,将产生错误。set sql_mode=‘stricat——all_tables,error_for_division_by_zero’;
2.默认情况下,mysql运行‘zero’日期和有0部分的日期。例如日期被允许尽管你能够采用严格模式,但是如果你想阻止他们,可以使用NO_zero_date 和no_zero_in_date
这traditional模式值是一个组合模式能够严格模式和其他限制被描述。如果你想要Mysql服务器关于输入数据检查
5.8.5 覆盖输入数据限制
为了覆盖输入数据限制,使用insert ignoreor update ignore 而不是使用insert or update。这ignore关键字经引起mysql使用non-strict行为对于这个语句。
如果你想要使用relaxed日期检查,需要set sql_mode='allow_invalid_dates';
set sql_mode='strict_all_tables,allow_invalid_dates';
处理丢失和无效的数据值相关推荐
- cdf(Cumulative Distribution Function)累积分布函数==>小于等于当前数据值的所有数据的概率分布
对于一维数据的可视化,直方图(Histogram)与核密度估计(Kernel Density Estimates)可以很好的表示各个数据值的概率分布,但在表示数据累积分布上这两种方法就无能为力了. 数 ...
- 关于tushare.get_h_data 返回数据值为空以及获取token码
tushare.get_h_data 返回数据值为空: 具体情况如下: 代码: import tushare as ts data = ts.get_h_data('000001',start='20 ...
- 压缩人工智能的数据值
压缩人工智能的数据值 Squeezing the value out of data for AI 数据是一切-在许多方面,是唯一的东西-自动驾驶汽车(AVs)供应商依赖深度学习作为自动驾驶的关键. ...
- pandas计算dataframe两列数据值相等的行号、取出DataFrame中两列值相等的行号
pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号 目录 pandas计算dataframe两列数据值相等的行号.取出DataFrame中两列值相等的行号
- R语言使用ggplot2可视化堆叠条形图,并在堆叠条形图上显示数据值实战
R语言使用ggplot2可视化堆叠条形图,并在堆叠条形图上显示数据值实战 目录 R语言使用gg
- python计算csv文件内的数据_Python利用pandas计算多个CSV文件数据值的实例
功能:扫描当前目录下所有CSV文件并对其中文件进行统计,输出统计值到CSV文件 pip install pandas import pandas as pd import glob,os,sys in ...
- integer是值传递还是引用传递_数据值Value传递-高位传递
立题简介: 内容:数据值Value传递-高位传递: 来源:实际得出: 作用:数据值Value传递-高位传递: 开发环境:Windows10+Visual Studio 2013:: 日期:2019-0 ...
- boost::safe_numerics模块实现隐式转换更改数据值的测试程序
boost::safe_numerics模块实现隐式转换更改数据值的测试程序 实现功能 C++实现代码 实现功能 boost::safe_numerics模块实现隐式转换更改数据值的测试程序 C++实 ...
- 链接服务器 '(null)' 的 OLE DB 访问接口'STREAM' 返回了对列 '[!BulkInsert].field' 无效的数据...
SSIS中数据流任务或者 DTS数据表对表同步(一般是从文本导到数据库表中),抛出下面异常 链接服务器 '(null)' 的 OLE DB 访问接口'STREAM' 返回了对列 '[!BulkInse ...
最新文章
- python回归建模_Python实现回归预测及模型优化
- C++,那些可爱的小陷阱(一)
- php接收ajax转数组
- c++ Linux中查找查找文件夹中的所有文件
- dubbo 相关面试题 有用
- 3.1.1 Spring 简介
- 华为:今年至少 3 亿台设备使用鸿蒙;增长 7%,互联网人薪资报告出炉;英特尔侵犯芯片专利被判赔偿 22 亿美元 | 极客头条...
- C# dataTable实用例
- JavaScript原型、函数伪装(apply,call)、继承
- unity 灯光阴影
- 基于matlab的捷联惯导算法编程(二)
- python阿拉伯数字转中文_阿拉伯数字转换成中文的python代码
- Life:歌曲学习之教一个不会唱歌的人学会唱出《情非得已》、《海阔天空》、《红日》、《老男孩》等歌曲
- APP开发的需求分析主要包括哪些?
- Playing games
- hadoop SWAP交换空间
- 转行软件开发的通用学习路径(转自刘校长亲笔)
- pytorch 定义torch类型数据_PyTorch 使用 TorchText 进行文本分类
- 电影院和计算机和字典的英语怎么拼,电影院用英语怎么读
- Java——Java语言基础
热门文章
- 牛客网(剑指offer) 第十六题 合并两个排序的链表
- weblogic ssrf漏洞复现
- 子域名查询DNS记录查询
- iOS之深入解析Runtime的objc_msgSend“慢速查找”底层原理
- 【数据结构与算法】之深入解析“寻找峰值”的求解思路与算法示例
- 【数据结构与算法】之深入解析图的拓扑排序
- 17. Letter Combinations of a Phone Number 电话号码的字母组合
- Linux(五) 权限
- python 出现 AttributeError: matplotlib‘ object has no attribute ‘to_rgba‘
- 【STM32】系统配置控制器相关函数和类型