• 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;

  • 相关阅读:
    winform中textbox属性Multiline=true时全选
    golang中的类和接口的使用
    beego上传文件
    golang 字符串操作实例
    golang操作文件
    golang获取程序运行路径
    ECharts使用心得
    es6新特性分享
    es6分享——变量的解构赋值
    NPM使用前设置和升级
  • 原文地址:https://www.cnblogs.com/BradMiller/p/10123392.html
Copyright © 2020-2023  润新知