您的位置:首页 > 数据库 > MySQL

mysql的sql_mode

2012-11-20 10:48 204 查看



mysql可以运行在不同sql mode模式下面,sql mode模式定义了mysql应该支持的sql语法,数据校验等!

一、设置方法:

[mysqld] --下添加如下设置

transaction-isolation=SERIALIZABLE

sql-mode=ANSI

二、模式说明:

查看默认的sql mode模式:

select @@sql_mode;

我的数据库是:

STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

在此模式下面,如果插入的数据的长度大于定义的长度,那么就会报错!

默认情况下是空。

set session sql_mode='REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI';

在这种模式下面:插入的数据的长度大于定义的时候,就会截取,并警告,但是可以插入进去

session表示只在本次中有效

global:表示在本次连接中不生效,而对于新的连接就生效

启用NO_BACKSLASH_ESCAPES模式,使反斜线成为普通字符,在导入数据时候,如果数据中有反斜线,启用这个模式是个不错的选择

启用PIPES_AS_CNCAT模式,将||看成是普通字符串

常用的sql mode:

sql mode值 说明

ANSI: 'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE和ANSI组合',这种模式使语法和行为更符合标准的sql

STRICT_TRANS_TABLES : 使用与事务和非事务表,严格模式

TRADITIONAL : 也是严格模式,对于插入不正确的值给出错误而不是警告。用在事务时,只要发生错误就立即回滚

在Mysql5.0以下,默认的 (sql mode参数)有:real_as_float,pipes_as_concat,ansi_quotes,gnore_space和ANSI。在这些模式下可以插入超过字段定义长度的数据,或是在字段中没有定义的元素数据(如,enum)。不过在插入后会有一个warning(可以用 show warnings来查看)。 在Mysql5.0以上版本中,有三种sql mode模式(ANSI、TRADITIONAL和STRICT_TRANS_TABLES(严格模式))可以用来解决以下问题:

(1). 通过设置不同的sql mode,可以在不同严格程序进行数据校验,有效地保证了数据准确性.

(2).通过设置sql mode为ANSI模式,来保证大多数SQL符合标准SQL的语法,这样在不同数据库之间迁移时,不需要对业务修改太多.通过设置sql mode为STRICT_TRANS_TABLES(严格模式)来实现数据的严格校检,使错误数据不能插入,从而保证数据准确性。TRADITIONAL模式也属于严格模式,同样可以实现严格校检,使错误数据不能插入,从而保证数据准确性。不过在这种模式MAX(X,0)返回的结果是NULL,所以在包含有MAX的运算中根据实际情况设定好sql mode.ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。在某些情况下,ENUM值也可以为空字符串('')或NULL:如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。

如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且 默认值为NULL。如果ENUM列被声明为NOT NULL,其默认值为允许的值列的第1个元素。

(1)sql mode为ANSI

mysql> create table test(id bigint(20) auto_increment primary key, browsertype enum('ie','firefox','other'));

mysql> insert into test(browsertype) values('ie') ;

Query OK, 1 row affected (0.07 sec)

mysql> insert into test(browsertype) values('maxthon') ;

Query OK, 1 row affected (0.03 sec)

mysql> show warnings;(数据虽然成功insert,但有warning)

+---------+------+--------------------------------------------------+

| Level | Code | Message |

+---------+------+--------------------------------------------------+

| Warning | 1265 | Data truncated for column 'browsertype' at row 1 |

+---------+------+--------------------------------------------------+

1 row in set (0.01 sec)mysql> select * from test;

+----+-------------+

| id | browsertype |

+----+-------------+

| 1 | ie |

| 2 | |

+----+-------------+

2 rows in set (0.01 sec)(2)使用严格模式(STRICT_TRANS_TABLES)

mysql> set session sql_mode='STRICT_TRANS_TABLES';

Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;

+---------------------+

| @@sql_mode |

+---------------------+

| STRICT_TRANS_TABLES |

+---------------------+

1 row in set (0.00 sec)

mysql> insert into test(browsertype) values('maxthon') ;

ERROR 1265: Data truncated for column 'browsertype' at row 1

mysql> insert into test(browsertype) values('firefox') ;

Query OK, 1 row affected (0.00 sec) mysql> select * from test;

+----+-------------+

| id | browsertype |

+----+-------------+

| 1 | ie |

| 2 | |

| 3 | firefox |

+----+-------------+

3 rows in set (0.00 sec)

(3) TRADITIONAL模式

mysql> create table t11 (i int);

Query OK, 0 rows affected (0.02 sec)

mysql> set sql_mode='ANSI';

Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(9%0);

Query OK, 1 row affected (0.00 sec)

mysql> select * from t11;

+------+

| i |

+------+

| NULL |

+------+

1 row in set (0.00 sec)

mysql> set sql_mode='TRADITIONAL';

Query OK, 0 rows affected (0.00 sec)

mysql> insert into t11 values(9%0);

ERROR 1365: Division by 0

mysql> show warnings;

+-------+------+---------------+

| Level | Code | Message |

+-------+------+---------------+

| Error | 1365 | Division by 0 |

+-------+------+---------------+

1 row in set (0.02 sec)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: