zoukankan      html  css  js  c++  java
  • mysql 严格模式 sql_mode

    转自:http://hi.baidu.com/houqiang_hq/item/125b8b0aa0b05e096c9048d5

    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
    1 'one'
    2 'two'
    3 'three'

    枚举最多可以有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)


    归根到低要把 mysql 从严格模式下 改为宽松模式 只要找到my.ini文件 搜索查到

    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    把sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    改为sql-mode="ANSI" 重启Mysq服务即可

  • 相关阅读:
    SpringBoot集成Swagger2并配置多个包路径扫描
    SpringBoot基于EasyExcel解析Excel实现文件导出导入、读取写入
    SpringBoot + SpringSecurity + Quartz + Layui实现系统权限控制和定时任务
    Redis数据持久化(RDB、AOF)
    so安全编译选项(栈溢出保护)
    Python调用Chrome下载文件
    AtomicInteger如何保证线程安全以及乐观锁/悲观锁的概念
    SpringCloud:Eureka的健康检测机制
    共享锁(S锁)和排它锁(X锁)
    Collection接口及其常用子类(java.util包)
  • 原文地址:https://www.cnblogs.com/mtima/p/3622375.html
Copyright © 2011-2022 走看看