• 16.Mysql SQL Mode


    16.SQL Mode及相关问题
    SQL Mode定义了Mysql支持的SQL语法和数据校验级别,Mysql支持多种SQL Mode。
    用途:
    设置不同的SQL Mode可以对数据进行不同严格程度的校验,即在不同应用环境提供不同的数据质量;
    设置不同的SQL Mode可以方便数据迁移至目标数据库;
    ANSI模式可以保证大多数SQL符合SQL标准语法,方便应用在不同数据库上迁移。
    16.1 Mysql SQL Mode简介
    1.查看当前SQL Mode
    select @@sql_mode;
    2.修改SQL Mode
    语法:
    set [session|global] sql_mode='sql模式名';
    说明:
    session 只对当前会话有效,其余会话无效;
    global 对所有新会话有效,mysql重启后失效;
    在my.cnf文件中设置sql_mode='sql模式名' 持久有效。

    16.2 SQL Mode的常见功能
    sql模式分为模式组和原子模式,模式组由固定的原子模式组成,多个原子模式与多个原子模式或多个模式组可以自由组合。
    原子模式包括:
    REAL_AS_FLOAT : REAL 为 FLOAT 的同义词(默认情况, REAL 为 DOUBLE 的同义词).
    PIPES_AS_CONCAT :管道符(||) 作为连接符.(默认使用函数 CONCAT 连接字符)
    ANSI_QUOTES : 标准引号, 双引号不作为字符串引号,作为关键字标识符引号
    IGNORE_SPACE :对于内置函数与其他字符间的空格,忽略空格
    ONLY_FULL_GROUP_BY(MySQL 5.7.5) select 非group by列报错。聚合语句安装标准写法,如 oracle sqlserver 一样。
    NO_ZERO_IN_DATE :警告,日期格式(月日)是'00'
    NO_ZERO_DATE :警告,日期格式是 '0000-00-00'
    ERROR_FOR_DIVISION_BY_ZERO :警告,除数为0
    NO_AUTO_CREATE_USER 禁止使用 GRANT 创建密码为空的用户。
    NO_ENGINE_SUBSTITUTION :默认情况创建或修改表的存储引擎不支持时,自动转为默认的INNODB;使用该模式后,存储引擎不支持时则报错。
    ALLOW_INVALID_DATES :警告,检查日期格式合法性(DATE 或 DATETIME, 非 TIMESTAMP )
    NO_AUTO_VALUE_ON_ZERO :运行序列中插入 "0",如果 id 不约束唯一, 可插入多个。插入 NULL 值默认都会自增。
    HIGH_NOT_PRECEDENCE :未使用模式 HIGH_NOT_PRECEDENCE, "not id between 2 and 4" 相当于 "not (id between 2 and 4)";使用模式 HIGH_NOT_PRECEDENCE, "not id between 2 and 4" 相当于 "(not id) between 2 and 4".
    NO_BACKSLASH_ESCAPES :反斜杠""为普通字符而不是转义字符。
    NO_UNSIGNED_SUBTRACTION : UNSIGNED 类型如果得到一个负值,则报错。(尽量不要 UNSIGNED)
    PAD_CHAR_TO_FULL_LENGTH :对于 char、nchar 类型,默认以空字符填充,查询时自动去掉空字符。启用该模式后,查询时空字符保留。
    NO_DIR_IN_CREATE :创建表分区时,忽略命令 INDEX DIRECTORY 和 DATA DIRECTORY。用于副本示例中的选项。

    16.3 常用的SQL Mode
    固定模式组分为:
    ANSI 非严格模式:数据长超、非法日期不会报错
    REAL_AS_FLOAT : REAL 为 FLOAT 的同义词(默认情况, REAL 为 DOUBLE 的同义词).
    PIPES_AS_CONCAT :管道符(||) 作为连接符.(默认使用函数 CONCAT 连接字符)
    ANSI_QUOTES : 标准引号, 双引号不作为字符串引号,作为关键字标识符引号
    IGNORE_SPACE :对于内置函数与其他字符间的空格,忽略空格
    ONLY_FULL_GROUP_BY(MySQL 5.7.5)
    STRICT_TRANS_TABLES :对事务型表操作,插入表时如果第一行数据不符合约束则终止执行并回滚。
    NO_ZERO_IN_DATE
    NO_ZERO_DATE
    ERROR_FOR_DIVISION_BY_ZERO
    TRADITIONAL 严格模式:非法日期、除数为0、数据超长 报错
    STRICT_TRANS_TABLES :对事务型表操作,插入表时如果第一行数据不符合约束则终止执行并回滚。
    STRICT_ALL_TABLES
    NO_ZERO_IN_DATE:
    NO_ZERO_DATE:
    ERROR_FOR_DIVISION_BY_ZERO:除数为0报错
    NO_AUTO_CREATE_USER:
    NO_ENGINE_SUBSTITUTION

    16.4 SQL Mode在迁移中如何使用
    POSTGRESQLDB2MSSQL
    PIPES_AS_CONCAT
    ANSI_QUOTES
    IGNORE_SPACE
    NO_KEY_OPTIONS
    NO_TABLE_OPTIONS :建表语句不包括engine
    NO_FIELD_OPTIONS
    ORACLEMAXDB
    PIPES_AS_CONCAT
    ANSI_QUOTES
    IGNORE_SPACE
    NO_KEY_OPTIONS
    NO_TABLE_OPTIONS
    NO_FIELD_OPTIONS
    NO_AUTO_CREATE_USER 禁止使用 GRANT 创建密码为空的用户。
    NO_BACKSLASH_ESCAPES : 将视为普通字符

    16.5 小结
    mysql5.7 默认模式:
    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,
    5.7.4 废弃:ERROR_FOR_DIVISION_BY_ZERO
    5.7.5 默认:ONLY_FULL_GROUP_BY , STRICT_TRANS_TABLES
    5.7.7 默认:NO_AUTO_CREATE_USER
    5.7.8 默认:ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE, NO_ZERO_IN_DATE

    NO_AUTO_CREATE_USER 禁止使用 GRANT 创建密码为空的用户。
    标准写法:
    create user user01@'localhost' identified by 'user01';
    grant all on test.* to user01@'localhost';
    flush privileges;

  • 相关阅读:
    Zend Framework 2.1.5 中根据服务器的环境配置调用数据库等的不同配置
    在基于 Eclipse 的 IDE 中安装和使用 Emmet(ZenCoding)
    【翻译】Emmet(Zen Coding)官方文档 之六 自定义 Emmet
    【翻译】Emmet(Zen Coding)官方文档 之二 缩写
    【翻译】Emmet(Zen Coding)官方文档 之七 一览表
    【翻译】Emmet(Zen Coding)官方文档 之三 CSS 缩写
    【翻译】Emmet(Zen Coding)官方文档 之四 动作
    【翻译】Emmet(Zen Coding)官方文档 之一 web 编程的必备工具
    Zend Framework 2 时区设置警告问题的解决
    【翻译】Emmet (Zen Coding) 元素类型
  • 原文地址:https://www.cnblogs.com/BradMiller/p/10123392.html
Copyright © 2020-2023  润新知