• Mysql Mode


     

    MySQL可以运行在不同的SQLMode(SQL模式)下。SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。

     

     

    查询默认的sql mode

    mysql> select @@sql_mode;
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | @@sql_mode                                                                                                                                |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | 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 |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    1 row in set (0.00 sec)

    ANSI 模式

     

    create table nj(cc datetime);
    set session sql_mode='ANSI';
    insert into nj  values ('2019-13-221');

    你发现这时候是可以插入的,但是数据的值就是0000-00-00 00:00:00

     

    set session sql_mode='TRADITIONAL';
    insert into t  values ('2019-13-221');
    [22001][1292] Data truncation: Incorrect datetime value: '2019-13-221' for column 'cc' at row 1

    换成 TRADITIONAL 模式之后发现插入报错了,因为 TRADITIONAL 是严格模式

     

     

     

    插入的字符串 被转换了

     

    mysql> set session sql_mode='ANSI';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    mysql> create table t2(cc varchar(20));
    Query OK, 0 rows affected (0.24 sec)
    mysql> insert into t2  values ('
    anjing');
    Query OK, 1 row affected (0.03 sec)
    mysql> select * from t2;
    +---------+
    | cc      |
    +---------+
    | 
    anjing |
    +---------+
    1 row in set (0.00 sec)
    

    发现插入的字符串 被干掉了, 是ANSI 模式下给你转义了

    如果想原封不动的插入

    set session sql_mode='NO_BACKSLASH_ESCAPES';
    insert into t2  values ('
    anjing');
    mysql> select * from t2;
    +----------+
    | cc       |
    +----------+
    |
    anjing  |
    | 
    anjing |
    +----------+
    2 rows in set (0.01 sec)

    启用NO_BACKSLASH_ESCAPES模式,使反斜线成为普通字符。在导入数据时,如果数据中含有反斜线字符,那么启用NO_BACKSLASH_ESCAPES模式保证数据的正确性,是个不错的选择。

     

     

    在 ANSI模式下 || 还可以当拼接字符串使用

    set session sql_mode ='ANSI';
    select 'beijing' || 'nanjing';
    beijingnanjing

     

     

    常用Mode

     

    ANSI

    等同于 REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE  和ANSI 组合模式,这种模式使语法和行为更符合标准的SQL

    STRICT_TRANS_TABLES

    STRICT_TRANS_TABLES 适用于事物表和非事物表,它是严格模式,不允许非法日期,也不允许超过字段长度的值插入字段中,对于插入不正确的值给出错误而不是警告

    TRADITIONAL

    TRADITIONAL模式等同于  STRCT_TRANS_TABLES,STRICT_ALL,NO__ZERO_IN_DATE,ERROR_FOR_DIVSION_BY_ZERO,TRADITIONAL 和NO_AUTO_CREATE_USER 组合模式,所以它也是严格模式,对于插入不正确的值给出错误而不是警告,可以应用在事物表和非事物表,用在事物时,出现错误就会立刻回滚

     

     

     

  • 相关阅读:
    牛客小白月赛12 392B
    牛客392A 经典区间覆盖
    hihocoder contest95 1、3、4题目分析 2赛后补题
    hiho一下第234周《矩形计数》题目与解答
    Light oj 1306
    请访问我新的博客
    比特币“投资”记录-1
    如何清爽的使用网页版新浪微博
    Vuex/Vue 练手项目 在线汇率转换器
    重装macOS环境配置笔记
  • 原文地址:https://www.cnblogs.com/wlphp/p/12906472.html
Copyright © 2020-2023  润新知