zoukankan      html  css  js  c++  java
  • 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 组合模式,所以它也是严格模式,对于插入不正确的值给出错误而不是警告,可以应用在事物表和非事物表,用在事物时,出现错误就会立刻回滚

     

     

     

  • 相关阅读:
    Linux 下Firefox无法打开在'.domain'之前带有中划线的域名
    [Shell] 简单的自动检查ssh代理是否正常的脚本
    linux日志自动分割shell
    2014年学习计划
    [genome shell]标题栏优化
    什么样才叫解决问题?
    [mysql]清除单表大量数据方法(需保留部分数据)
    用linux c求最大公约数
    解决64位debian下无法安装ia32库的问题
    postfix邮箱服务器修改附件大小限制遇到的问题与解决
  • 原文地址:https://www.cnblogs.com/wlphp/p/12906472.html
Copyright © 2011-2022 走看看