linux 设置sql model,[原创] sql mode与 enum 类型

1.sql mode简介

在Mysql中,sql mode可以用来解决以下问题

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

(2).通过设置sql mode为ANSI模式,来保证大多数SQL符合标准SQL的语法,这样在不同数据库之间迁移时,不需要对业务    修改太多.

在Mysql 5.0以下,查询默认的sql mode(sql mode参数)有:real_as_float,pipes_as_concat,ansi_quotes,gnore_space和ANSI。在这些模式下可以插入超过字段定义长度的数据,或是在字段中没有定义的元素数据(如,enum)。不过在插入后会有一个warning(可以用 show warnings来查看)。

可以通过设置sql mode为STRICT_TRANS_TABLES(严格模式)来实现数据的严格校检,使错误数据不能插入,从而保证数据准确性。

TRADITIONAL模式也属于严格模式,同样可以实现严格校检,使错误数据不能插入,从而保证数据准确性。不过在这种模式MAX(X,0)返回的结果是NULL,所以在包含有MAX的运算中根据实际情况设定好sql mode.

2.ENUM简介

ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。

在某些情况下,ENUM值也可以为空字符串('')或NULL:

如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。

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

每个枚举值有一个索引:

来自列规定的允许的值列中的值从1开始编号。

空字符串错误值的索引值是0。这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行:

select * from test where browsertype=0;

NULL值的索引是NULL。

例如,定义为ENUM的列('one','two','three')可以有下面所示任何值。还显示了每个值的索引:

索引

NULL

NULL

''

0

'one'

1

'two'

2

'three'

3

枚举最多可以有65,535个元素。

当创建表时,ENUM成员值的尾部空格将自动被删除。

当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM列分配字符集和 校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。

3.举列测试

(1)sql mode为ANSI

mysql> create table test(id bigint(20) auto_increment primary key,

-> browsertype enum('ie','firefox','other')

-> );

Query OK, 0 rows affected (0.10 sec)

mysql> desc test;

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

| Field       | Type                         | Null | Key | Default | Extra          |

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

| id          | bigint(20)                   | NO   | PRI | NULL    | auto_increment |

| browsertype | enum('ie','firefox','other') | YES  |     | NULL    |                |

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

2 rows in set (0.05 sec)

mysql> set session sql_mode='ANSI';

Query OK, 0 rows affected (0.14 sec)

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)

mysql> select * from test where browsertype=0;(空字符串错误值的索引值是0。SELECT可找出分配了非法ENUM值的行)

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

| id | browsertype |

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

|  2 |             |

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

1 row in set (0.04 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> select * from test;

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

| id | browsertype |

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

|  1 | ie          |

|  2 |             |

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

2 rows 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%4);

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值