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

     

     

     

  • 相关阅读:
    【原创】交换机多端口抓包配置教程
    【转】常用的C语言宏定义
    【转】C语言中可变参数的函数(三个点,“...”)
    【转】SIP响应状态码
    【转】交换机常用功能——端口监控应用举例
    【转】网线水晶头的接法
    【转】三层交换机vlan接口配置
    【转】各种常见的交换机接口及连接方法介绍
    【转】Internet多媒体会议工具包的使用示例
    【转】SDP
  • 原文地址:https://www.cnblogs.com/wlphp/p/12906472.html
Copyright © 2011-2022 走看看