sql_mode 之 ignore_space

用于忽略mysql系统函数名与之后的括号之间的空格、

还是给个形像的说明吧如:count   (*) 通过设置ignore_space 这个sql_mode 就可以把空格给忽略变成count(*)

1、先从一个普通的例子开始讲起

create table t(id int not null primary key auto_increment, x int);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t(x) values(1),(2),(3),(4),(5),(6);
Query OK, 6 rows affected (0.01 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select count(*) from t; -- 查看t表中有多少行数据
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

  上面这个例子还是比较“中规中矩”、但是生活中又总是有一些人“放荡不羁有自由”;比如他们要建一张表、表名就叫count!

2、建立一张名叫count的表(1)

create table count(x int);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘count(x int)‘ at line 1

  看到这个语法错误你可能会想到count是关键字、是不是要明确的标记出来呢? 于是

3、建立一张名叫count的表(2)

create table `count`(x int);
Query OK, 0 rows affected (0.02 sec)

  惊不惊喜? 我想答案一定的否定的、因为我们今天主讲的是ignore_space这个sql_mode 然而它到这里了还没有登场! 就已经有了一种快完了的感觉。

4、建立一张名叫count的表(3)

create table count (x int);
Query OK, 0 rows affected (0.02 sec)

 

5、而2,3,4我们知道表有两种建法、一是加反引号的 二是加空格的;但是对于函数count的调用也可以有两种写法吗?

select count (*) from t;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘*) from t‘ at line 1

  由这里可以看到函数与括号之间默认是不能有空格的、如果有的话会报错;有没有一种方式可以让mysql兼容函数的两种写法呢?

  有它就是我们今天的主角igonre_space 这个SQL_MODE

6、通过sql_mode来兼容两种count函数的写法

select @@sql_mode;
+---------------------------------------------------------+
| @@sql_mode                                              |
+---------------------------------------------------------+
| STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION |
+---------------------------------------------------------+
1 row in set (0.00 sec)

mysql> set @@session.sql_mode=concat(@@sql_mode,‘,IGNORE_SPACE‘);
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select @@sql_mode;
+----------------------------------------------------------------------+
| @@sql_mode                                                           |
+----------------------------------------------------------------------+
| IGNORE_SPACE,STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select count (*) from t;
+-----------+
| count (*) |
+-----------+
|         6 |
+-----------+
1 row in set (0.00 sec)

mysql> select count(*) from t;
+----------+
| count(*) |
+----------+
|        6 |
+----------+
1 row in set (0.00 sec)

sql_mode加上ignore_space 有什么不足的地方?

  1、由于它直接忽略了空格、所以就造成了有的语法就不起作用了、如:create table count (x int);

  2、出现这种需求时多半是不好的编程习惯引起的、如刚才的例子当中、居然给表起了一个叫“count”的名字。

----

时间: 2024-10-10 22:10:01

sql_mode 之 ignore_space的相关文章

MySQL或者MariaDB里面sql_mode的设置详解

详见MySQL5.6手册的"Server SQL Modes"章节. 地址:http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html 参考了好几个网站的博文,出处不太好找了,对大家的分享表示感谢. MySQL5.6的sql_mode是STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION MariaDB10.0.17的sql_mode是空的. sql_mode 分为global.session作用范围. &g

MySQL数据类型:SQL_MODE设置不容忽视

[IT168 技术]SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空.SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插入NOT NULL的字段中,也可以插入一些非法日期,如“2012-12-32”.因此在生产环境中强烈建议开发人员将这个值设为严格模式,这样有些问题可以在数据库的设计和开发阶段就能发现,而如果在生产环境下运行数据库后发现这类问题,那么修改的代价将变得十分巨大.此外,正确地设置SQL_MODE还可以做一

[Mysql]由Data truncated for column联想到的sql_mode配置

系统日志中出现了 ata truncated for column 'agent' at row 1 mysql出现这个问题的原因,无非就是字符集设置 或者是 字段过长导致的. mysql在初始化的时候已经统一为utf-8了,所以可以忽略这个问题. 字符串过长从而导入插入失败 一种方式是修改字段长度,可是我这个字段没法知道到底多长存储合适,不太好 一种方式是在程序中截取字符串,这个方法可行,也比较好. 但是我又想了想,以前的时候为啥会自动截断,这次就插入不进去了了呢? 原因是mysql的sql_

MySQL::SQL_MODE

SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空.SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插入NOT NULL的字段中,也可以插入一些非法日期,如“2012-12-32”.因此在生产环境中强烈建议开发人员将这个值设为严格模式,这样有些问题可以在数据库的设计和开发阶段就能发现,而如果在生产环境下运行数据库后发现这类问题,那么修改的代价将变得十分巨大.此外,正确地设置SQL_MODE还可以做一些约束(Constr

MySQL5.5 SQL_MODE设置

一:SQL_MODE的作用 SQL_MODE是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题 二:SQL_MODE包含的模式 ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告. TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验

mysql的sql_mode合理设置

MySQL的sql_mode合理设置 sql_mode是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题   sql_mode常用值如下: ONLY_FULL_GROUP_BY: 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中 NO_AU

SQL_MODE设置

1.1.   SQL_MODE设置 在生产环境中强烈建议将这个值设置为严格模式,这样有些问题可以在数据库的设计和开发阶段就能实现,而如果在生产环境下运行数据库后发现这类问题,那么修改的代价将变得十分巨大.此外正确地设置sql_mode还可以做一些约束(constraint)检查的工作. 对于sql_mode的设置,可以在配置文件.客户端.当前会话或者全局会话中设置.查看sql_mode的设置情况: mysql>select @@global.sql_mode; +----------------

Mysql的sql_mode

(一) 基本介绍 set sql_mode="",即强制不设定MySql模式(如不作输入检测.错误提示.语法模式检查等)应该能提高性能,但有如下问题: 如果插入了不合适数据(错误类型或超常),mysql会将数据设为"最好的可能数据"而不报错,如: /数字 设为:0/可能最小值/可能最大值 /字符串 设为:空串/能够存储的最大容量字符串 /表达式 设为:返回一个可用值(1/0-null) 所以,解决办法是:所有列都要采用默认值,这对性能也好. 当然,如果你特别喜欢sq

MySQL5.5 SQL_MODE

一:SQL_MODE的作用 SQL_MODE是个很容易被忽视的变量,默认值是空值,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入.在生产环境必须将这个值设置为严格模式,所以开发.测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题 二:SQL_MODE的模式 ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告. TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保