- 浏览: 7942779 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (2425)
- 软件工程 (75)
- JAVA相关 (662)
- ajax/web相关 (351)
- 数据库相关/oracle (218)
- PHP (147)
- UNIX/LINUX/FREEBSD/solaris (118)
- 音乐探讨 (1)
- 闲话 (11)
- 网络安全等 (21)
- .NET (153)
- ROR和GOG (10)
- [网站分类]4.其他技术区 (181)
- 算法等 (7)
- [随笔分类]SOA (8)
- 收藏区 (71)
- 金融证券 (4)
- [网站分类]5.企业信息化 (3)
- c&c++学习 (1)
- 读书区 (11)
- 其它 (10)
- 收藏夹 (1)
- 设计模式 (1)
- FLEX (14)
- Android (98)
- 软件工程心理学系列 (4)
- HTML5 (6)
- C/C++ (0)
- 数据结构 (0)
- 书评 (3)
- python (17)
- NOSQL (10)
- MYSQL (85)
- java之各类测试 (18)
- nodejs (1)
- JAVA (1)
- neo4j (3)
- VUE (4)
- docker相关 (1)
最新评论
-
xiaobadi:
jacky~~~~~~~~~
推荐两个不错的mybatis GUI生成工具 -
masuweng:
(转)JAVA获得机器码的实现 -
albert0707:
有些扩展名为null
java 7中可以判断文件的contenttype了 -
albert0707:
非常感谢!!!!!!!!!
java 7中可以判断文件的contenttype了 -
zhangle:
https://zhuban.me竹板共享 - 高效便捷的文档 ...
一个不错的网络白板工具
http://www.ywnds.com/?p=8865
在使用MySQL 5.7版本时,已经碰到了两起因为SQL_MODE的改变而导致的问题了,究其原因都是因为MySQL 5.7控制的更加严格了,所以在MySQL 5.6或MySQL 5.5有些SQL语句就无法在MySQL 5.7执行了(会给开发带来一个很诡异的问题,就是代码一样、环境一样、SQL一样、测试跟正式怎么就报错呢?)。
说一下我碰到的两起事件:
1、某些GROUP BY的SQL语句无法执行了。
2、创建表时使用日期数据类型指定的默认值为0000-00-00时报错。
先看一下,MySQL 5.6&MySQL 5.7默认的SQL模式。
# MySQL 5.6 Default SQL_MODE;
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.7 Default SQL_MODE;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.6 Default SQL_MODE;
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.7 Default SQL_MODE;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
先简单说一下每个参数的含义:
ONLY_FULL_GROUP_BY
在严格模式下,不要让GROUP BY部分中的查询指向未选择的列,否则报错。
NO_ZERO_DATE
在严格模式,不要将’0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。
NO_ZERO_IN_DATE
在严格模式,不接受月或日部分为0的日期,对年不限制。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。
ERROR_FOR_DIVISION_BY_ZERO
在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
NO_AUTO_CREATE_USER
在严格模式下,防止GRANT自动创建新用户,除非还指定了密码。
NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎。
STRICT_TRANS_TABLES
为事务存储引擎启用严格模式,也可能为非事务存储引擎启用严格模式,非法数据值被拒绝,下面有详细说明。
严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。
对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:
对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。但是,在这种情况下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。
对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL都会生成警告而不是给出错误并继续执行语句。
严格模式不允许非法日期,例如’2004-04-31’。它不允许禁止日期使用“零”部分,例如’2004-04-00’或”零”日期。要想禁止,应在严格模式基础上,启用NO_ZERO_IN_DATE和NO_ZERO_DATE SQL模式。
如果你不使用严格模式(即不启用STRICT_TRANS_TABLES或STRICT_ALL_TABLES模式),对于非法或丢失的值,MySQL将插入调整后的值并给出警告。在严格模式,你可以通过INSERT IGNORE或UPDATE IGNORE来实现。
回答刚开始提出的两个问题?
1、某些GROUP BY的SQL语句无法执行了。
这是因为MySQL 5.7默认加入了ONLY_FULL_GROUP_BY参数。在MySQL的sql_mode是非ONLY_FULL_GROUP_BY语义时。一条select语句,MySQL允许target list中输出的表达式是除聚集函数或group by column以外的表达式,这个表达式的值可能在经过group by操作后变成undefined,例如:
select * from tt group by id;
1
select * from tt group by id;
而对于语义限制都比较严谨的多家数据库,如SQLServer、Oracle、PostgreSql都不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会被报错的,所以从MySQL 5.7版本开始修正了这个语义,就是我们所说的ONLY_FULL_GROUP_BY语义。而正确的写法如下:
select id from tt group by id;
select id,max(age) from tt group by id;
1
2
select id from tt group by id;
select id,max(age) from tt group by id;
所以ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果,要么是来自于group by list中的表达式的值。更详细的请看:MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍
2、创建表时使用日期数据类型指定的默认值为0000-00-00时报错。
这是因为MySQL 5.7默认加入了NO_ZERO_DATE和NO_ZERO_IN_DATE参数。通过上面的介绍,这两个参数还是有些区别的,NO_ZERO_DATE是完全匹配默认值为0000-00-00时才限制,而NO_ZERO_IN_DATE是在匹配到月或日任意为00时限制(对年不限制)。
当数据类型为date或datetime时,并且使用了NO_ZERO_IN_DATE限制,那么会有如下几种情况:
# 不合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-00-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 不合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-00-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
如果使用数据类型为timestamp就有点不太一样了。
timestamp类型取值范围:1970-01-01 00:00:00到2037-12-31 23:59:59。也就是说默认值最少需要调整为1970-01-02 00:00:00。
CREATE TABLE `test` (
`mid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`start_time` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00',
`end_time` timestamp NOT NULL DEFAULT '2037-12-31 23:59:59',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `test` (
`mid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`start_time` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00',
`end_time` timestamp NOT NULL DEFAULT '2037-12-31 23:59:59',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
最大值或最小值在timestamp合法范围内才行。网上大概看了看,部分人碰到这个问题都是数据库升级的时候,老的表结构无法在MySQL 5.7应用了。如果想调整SQL模式,直接在配置文件写入sql_mode参数跟上对应的模式参数即可。
3、修改字段类型小于小于最长字段时报错。
当启用严格模式时”STRICT_TRANS_TABLES或STRICT_ALL_TABLES”时,控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
mysql> select * from dd;
+--------------------------------+
| log |
+--------------------------------+
| 一二三四五六七八九十 |
+--------------------------------+
1 row in set (0.00 sec)
mysql> select * from dd;
+--------------------------------+
| log |
+--------------------------------+
| 一二三四五六七八九十 |
+--------------------------------+
1 row in set (0.00 sec)
mysql> set sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
ERROR 1265 (01000): Data truncated for column 'log' at row 1
mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
Query OK, 1 row affected, 1 warning (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 1
mysql> set sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
ERROR 1265 (01000): Data truncated for column 'log' at row 1
mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
Query OK, 1 row affected, 1 warning (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 1
MariaDB [dkey]> select * from dd;
+-----------------------------+
| log |
+-----------------------------+
| 一二三四五六七八九 |
+-----------------------------+
1 row in set (0.00 sec)
MariaDB [dkey]> select * from dd;
+-----------------------------+
| log |
+-----------------------------+
| 一二三四五六七八九 |
+-----------------------------+
1 row in set (0.00 sec)
可以看到非严格模式,默认把多余数据给截断了。
待续。。。如果再碰到什么问题接着补充。
在使用MySQL 5.7版本时,已经碰到了两起因为SQL_MODE的改变而导致的问题了,究其原因都是因为MySQL 5.7控制的更加严格了,所以在MySQL 5.6或MySQL 5.5有些SQL语句就无法在MySQL 5.7执行了(会给开发带来一个很诡异的问题,就是代码一样、环境一样、SQL一样、测试跟正式怎么就报错呢?)。
说一下我碰到的两起事件:
1、某些GROUP BY的SQL语句无法执行了。
2、创建表时使用日期数据类型指定的默认值为0000-00-00时报错。
先看一下,MySQL 5.6&MySQL 5.7默认的SQL模式。
# MySQL 5.6 Default SQL_MODE;
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.7 Default SQL_MODE;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.6 Default SQL_MODE;
mysql> select @@sql_mode;
+--------------------------------------------+
| @@sql_mode |
+--------------------------------------------+
| STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------+
1 row in set (0.00 sec)
# MySQL 5.7 Default SQL_MODE;
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
先简单说一下每个参数的含义:
ONLY_FULL_GROUP_BY
在严格模式下,不要让GROUP BY部分中的查询指向未选择的列,否则报错。
NO_ZERO_DATE
在严格模式,不要将’0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。
NO_ZERO_IN_DATE
在严格模式,不接受月或日部分为0的日期,对年不限制。如果使用IGNORE选项,我们为类似的日期插入’0000-00-00’。在非严格模式,可以接受该日期,但会生成警告。
ERROR_FOR_DIVISION_BY_ZERO
在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
NO_AUTO_CREATE_USER
在严格模式下,防止GRANT自动创建新用户,除非还指定了密码。
NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎。
STRICT_TRANS_TABLES
为事务存储引擎启用严格模式,也可能为非事务存储引擎启用严格模式,非法数据值被拒绝,下面有详细说明。
严格模式控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
对于事务表,当启用STRICT_ALL_TABLES或STRICT_TRANS_TABLES模式时,如果语句中有非法或丢失值,则会出现错误。语句被放弃并滚动。
对于非事务表,如果插入或更新的第1行出现坏值,两种模式的行为相同。语句被放弃,表保持不变。如果语句插入或修改多行,并且坏值出现在第2或后面的行,结果取决于启用了哪个严格选项:
对于STRICT_ALL_TABLES,MySQL返回错误并忽视剩余的行。但是,在这种情况下,前面的行已经被插入或更新。这说明你可以部分更新,这可能不是你想要的。要避免这点,最好使用单行语句,因为这样可以不更改表即可以放弃。
对于STRICT_TRANS_TABLES,MySQL将非法值转换为最接近该列的合法值并插入调整后的值。如果值丢失,MySQL在列中插入隐式 默认值。在任何情况下,MySQL都会生成警告而不是给出错误并继续执行语句。
严格模式不允许非法日期,例如’2004-04-31’。它不允许禁止日期使用“零”部分,例如’2004-04-00’或”零”日期。要想禁止,应在严格模式基础上,启用NO_ZERO_IN_DATE和NO_ZERO_DATE SQL模式。
如果你不使用严格模式(即不启用STRICT_TRANS_TABLES或STRICT_ALL_TABLES模式),对于非法或丢失的值,MySQL将插入调整后的值并给出警告。在严格模式,你可以通过INSERT IGNORE或UPDATE IGNORE来实现。
回答刚开始提出的两个问题?
1、某些GROUP BY的SQL语句无法执行了。
这是因为MySQL 5.7默认加入了ONLY_FULL_GROUP_BY参数。在MySQL的sql_mode是非ONLY_FULL_GROUP_BY语义时。一条select语句,MySQL允许target list中输出的表达式是除聚集函数或group by column以外的表达式,这个表达式的值可能在经过group by操作后变成undefined,例如:
select * from tt group by id;
1
select * from tt group by id;
而对于语义限制都比较严谨的多家数据库,如SQLServer、Oracle、PostgreSql都不支持select target list中出现语义不明确的列,这样的语句在这些数据库中是会被报错的,所以从MySQL 5.7版本开始修正了这个语义,就是我们所说的ONLY_FULL_GROUP_BY语义。而正确的写法如下:
select id from tt group by id;
select id,max(age) from tt group by id;
1
2
select id from tt group by id;
select id,max(age) from tt group by id;
所以ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在ONLY_FULL_GROUP_BY模式下,target list中的值要么是来自于聚集函数的结果,要么是来自于group by list中的表达式的值。更详细的请看:MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍
2、创建表时使用日期数据类型指定的默认值为0000-00-00时报错。
这是因为MySQL 5.7默认加入了NO_ZERO_DATE和NO_ZERO_IN_DATE参数。通过上面的介绍,这两个参数还是有些区别的,NO_ZERO_DATE是完全匹配默认值为0000-00-00时才限制,而NO_ZERO_IN_DATE是在匹配到月或日任意为00时限制(对年不限制)。
当数据类型为date或datetime时,并且使用了NO_ZERO_IN_DATE限制,那么会有如下几种情况:
# 不合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-00-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 不合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-00-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '1111-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
# 合法默认值;
CREATE TABLE `test` (`time` datetime NOT NULL DEFAULT '0000-01-01 00:00:00'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
如果使用数据类型为timestamp就有点不太一样了。
timestamp类型取值范围:1970-01-01 00:00:00到2037-12-31 23:59:59。也就是说默认值最少需要调整为1970-01-02 00:00:00。
CREATE TABLE `test` (
`mid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`start_time` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00',
`end_time` timestamp NOT NULL DEFAULT '2037-12-31 23:59:59',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
CREATE TABLE `test` (
`mid` int(11) unsigned NOT NULL AUTO_INCREMENT,
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`start_time` timestamp NOT NULL DEFAULT '1970-01-02 00:00:00',
`end_time` timestamp NOT NULL DEFAULT '2037-12-31 23:59:59',
PRIMARY KEY (`mid`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
最大值或最小值在timestamp合法范围内才行。网上大概看了看,部分人碰到这个问题都是数据库升级的时候,老的表结构无法在MySQL 5.7应用了。如果想调整SQL模式,直接在配置文件写入sql_mode参数跟上对应的模式参数即可。
3、修改字段类型小于小于最长字段时报错。
当启用严格模式时”STRICT_TRANS_TABLES或STRICT_ALL_TABLES”时,控制MySQL如何处理非法或丢失的输入值。有几种原因可以使一个值为非法。例如,数据类型错误,不适合列,或超出范围。当新插入的行不包含某列的没有显示定义DEFAULT子句的值,则该值被丢失。
mysql> select * from dd;
+--------------------------------+
| log |
+--------------------------------+
| 一二三四五六七八九十 |
+--------------------------------+
1 row in set (0.00 sec)
mysql> select * from dd;
+--------------------------------+
| log |
+--------------------------------+
| 一二三四五六七八九十 |
+--------------------------------+
1 row in set (0.00 sec)
mysql> set sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
ERROR 1265 (01000): Data truncated for column 'log' at row 1
mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
Query OK, 1 row affected, 1 warning (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 1
mysql> set sql_mode='STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
ERROR 1265 (01000): Data truncated for column 'log' at row 1
mysql> set sql_mode='';
Query OK, 0 rows affected (0.00 sec)
mysql> alter table dd change column log log varchar(9);
Query OK, 1 row affected, 1 warning (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 1
MariaDB [dkey]> select * from dd;
+-----------------------------+
| log |
+-----------------------------+
| 一二三四五六七八九 |
+-----------------------------+
1 row in set (0.00 sec)
MariaDB [dkey]> select * from dd;
+-----------------------------+
| log |
+-----------------------------+
| 一二三四五六七八九 |
+-----------------------------+
1 row in set (0.00 sec)
可以看到非严格模式,默认把多余数据给截断了。
待续。。。如果再碰到什么问题接着补充。
发表评论
-
让 InnoDB 多任务运行
2018-09-06 16:06 786今天偶然看到的一招,记录下 如果服务器上的参数 innodb_ ... -
mysql中查询连接工作状态
2018-05-31 15:13 686#!/bin/bash while true do mysql ... -
MYSQL BACKUP的SHELL相关语句
2018-05-25 20:33 550#!/bin/bash ###############Basi ... -
MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法
2018-05-08 11:17 623MySQL开启bin-log后,调用存储过程或者函数以及触发器 ... -
NUMA的选择
2018-04-24 09:52 1403现在的机器上都是有 ... -
关于MYSQL 5.7线程池的好文收集
2018-03-27 10:57 1529来自腾讯工程师的好文: https://www.jianshu ... -
MYSQL 的审计日志插件
2017-11-30 10:19 1285MYSQL 的审计日志插件,可惜目前只是LINUX用: 来自M ... -
(转)MySQL InnoDB缓冲池配置详解
2017-10-09 16:55 4072一、InnoDB缓冲池 InnoDB维护一个称为缓冲池的内存 ... -
(转)MySQL 5.7默认ONLY_FULL_GROUP_BY语义介绍
2017-10-05 18:45 1188http://www.ywnds.com/?p=8184 ON ... -
MySQL 5.6 新功能之 Index Condition Pushdown (ICP)
2017-10-05 15:52 792http://www.cnblogs.com/zhoujiny ... -
mysql 5.7中的MBR和BKA算法
2017-10-03 15:11 1719一、什么是MRR MMR全称是Multi-Range Re ... -
(收藏)万字总结:学习MySQL优化原理,这一篇就够了!
2017-09-30 23:37 1189http://dbaplus.cn/news-155-1531 ... -
(转)MySQL中NULL和空值的区别
2017-09-23 15:57 2230MySQL中NULL和空值的区别 http://www.yw ... -
mysql 5.7中关于count(*)的优化
2017-09-20 19:15 2352在mysql 5.7中,对于select count(*) f ... -
MySQL 索引设计概要
2017-09-12 21:12 518<<MySQL 索引设计概要>>,不错 ... -
10分钟学会理解和解决MySQL乱码问题
2017-07-22 18:21 546http://cenalulu.github.io/mysql ... -
MySQL的or/in/union与索引优化
2017-07-22 08:29 955https://mp.weixin.qq.com/s/ZWez ... -
MYSQL中查看某个表或库的大小语句
2017-04-02 09:12 1958在information_schema.tables中有相关记 ... -
(收藏)MYSQL大表方案
2017-01-09 19:58 1436https://segmentfault.com/a/1190 ... -
(转)MySQL 特性分析之内部临时表
2016-11-28 22:54 868MySQL中的两种临时表 外部临时表 通过CREATE TEM ...
相关推荐
总结来说,MySQL5.7精简版是一个适合初学者和小型项目使用的数据库解决方案,它集成了MySQL5.7的主要功能,同时降低了系统资源的需求,让用户能够更轻松地管理和操作数据库。无论你是进行开发、学习还是部署小型应用...
9. **安装与配置**:`MySQL5.7msi安装程序`是用于在Windows上安装MySQL 5.7的Microsoft Installer文件,它简化了安装过程,让用户能够轻松配置服务器设置和初始密码。 10. **高可用性和容错性**:5.7版本改进了...
在 MySQL 5.7 版本中,InnoDB 存储引擎成为默认引擎,提供了行级锁定、外键约束和事务支持,使得它在并发环境下表现出色。5.7.38 版本可能包含了针对 InnoDB 的进一步优化,例如更快的索引创建和查询执行,以及更好...
6. **更好的安全特性**:MySQL 5.7 提供了更严格的默认安全设置,如密码哈希策略的更新,以及更好的审计日志功能。 7. **优化的监控和诊断工具**:包括 Performance Schema 的增强,提供更详细的性能监控信息,以及...
本文主要内容是MySQL升级到5.7版本之后,由于默认的 sql_mode 值带来的坑以及对应的解决方案。 案例一:ONLY_FULL_GROUP_BY 问题描述 MySQL版本从5.6升级至5.7之后,部分SQL执行报错,报错信息如下: ERROR 1055 ...
是MySQL驱动的类名,`jdbc:mysql://localhost:3306/your_database` 是连接URL,其中 `localhost` 是服务器地址,`3306` 是默认的MySQL端口号,`your_database` 是你要连接的数据库名称。 总的来说,这两个JAR文件...
5. **安全增强**:MySQL 5.7 引入了增强的安全特性,如默认的加密连接、更好的权限管理系统以及更严格的审计日志,增强了数据保护和合规性。 6. **组复制**:MySQL 5.7 引入了组复制功能,这是一种高可用性和灾难...
对于“DBEAVER的mysql5.7驱动.zip”这个压缩包,我们可以理解它是专门为DBEAVER准备的MySQL 5.7版本的数据库驱动程序,目的是为了让DBEAVER能够连接和操作MySQL 5.7的数据库实例。 1. **DBEAVER简介**:DBEAVER是一...
MySQL 5.7是MySQL数据库管理系统的一个重要版本,专为Windows 10操作系统设计。这个安装包"mysql-5.7.36-winx64.msi"包含了MySQL Server 5.7.36的64位版本,适用于在Windows 10环境下部署和运行MySQL服务。 MySQL是...
MySQL 5.7.32 是 MySQL 数据库管理系统的一个重要稳定版本,对于系统安全性和性能都有显著提升。在本文中,我们将深入探讨 MySQL 5.7.32 的主要特点、在 Linux 上的安装过程以及如何确保数据库的安全性。 1. **...
- 强化了默认的安全设置,如默认启用的SQL模式`ONLY_FULL_GROUP_BY`,增强了数据完整性。 - 改进了密码加密和身份验证机制,例如支持使用SHA256密码插件。 - 引入了角色权限系统,便于管理和控制用户权限。 **复制...
当Kettle与MySQL数据库配合使用时,需要MySQL的JDBC驱动来建立连接,这就是“kettle(ETL工具)mysql 5.7 数据库的驱动包”的作用。 驱动包是Java Database Connectivity (JDBC)的一个组成部分,JDBC是Java平台标准...
在本压缩包"mysql5.7-jdbc.rar"中,包含了"mysql-connector-java-5.1.7-jdbc.jar"文件,这是MySQL的JDBC驱动程序,用于让Java应用程序能够连接到MySQL数据库。 首先,我们来详细了解一下MySQL 5.7中的关键特性: 1...
5. **Security强化**:MySQL 5.7增强了安全特性,如默认使用更安全的加密算法,加强了用户权限管理,支持SQL注入防御,以及改进的审计日志功能。 6. **存储过程和函数的改进**:5.7版本引入了更好的存储过程和函数...
7. **SQL模式**: MySQL 5.7支持全局SQL模式,可以统一服务器上的SQL语法规范,避免因不同模式导致的问题。 8. **备份与恢复**: 提供了mysqldump工具,用于数据库的备份和恢复,是数据库维护中的重要环节。 9. **...
在SQLMode方面,MySQL 5.7 GA版本默认启用了STRICT_TRANS_TABLES模式,这意味着对数据类型转换和数据范围不符合的严格处理,提高了数据的一致性和准确性。 MySQL 5.7在初始化安装方面也有所不同。从5.7.6版本开始,...
2. **SQL语法**:MySQL 5.7支持标准的SQL语法,包括DML(数据操作语言)、DDL(数据定义语言)和DCL(数据控制语言)。文档详细介绍了SELECT、INSERT、UPDATE、DELETE等查询语句,以及CREATE TABLE、ALTER TABLE、...
7. **安全增强**:MySQL 5.7提升了安全性,如强化了默认密码策略、增加了认证插件的灵活性,以及引入了更严格的SQL模式,以防止注入攻击。 8. **分区表改进**:5.7版本增强了分区表功能,包括对RANGE和LIST分区的...
4. **动态SQL**:通过`PREPARE`、`EXECUTE`和`DEALLOCATE`语句,MySQL 5.7提供了更强大的动态SQL能力,使得开发者可以在运行时构建和执行SQL语句,增强了灵活性。 5. **GROUP BY优化**:5.7版本改进了GROUP BY语句...
3. **SQL增强**:MySQL 5.7引入了窗口函数,增强了分析查询能力。此外,支持更复杂的JOIN操作和子查询优化,使得开发者可以编写出更强大的SQL语句。 4. **安全增强**:5.7版本加强了安全措施,如默认使用更安全的...