`

Mysql SQL Mode详解

阅读更多
Mysql SQL Mode简介

MySQL服务器能够工作在不同的SQL模式下,并能针对不同的客户端以不同的方式应用这些模式。这样,应用程序就能对服务器操作进行量身定制以满足自己的需求。这类模式定义了MySQL应支持的SQL语法,以及应该在数据上执行何种确认检查。这样,就能在众多不同的环境下、与其他数据库服务器一起更容易地使用MySQL。可以使用“--sql-mode="modes"”选项,通过启动mysqld来设置默认的SQL模式。从MySQL 4.1开始,也能在启动之后,使用SET [SESSION|GLOBAL] sql_mode='modes'语句,通过设置sql_mode变量更改模式。

通常在linux下安装完mysql后,默认的sql-mode值是空,在这种情形下mysql执行的是一种不严格的检查,例如日期字段可以插入’0000-00-00 00:00:00’这样的值,还有如果要插入的字段长度超过列定义的长度,那么mysql不会终止操作,而是会自动截断后面的字符继续插入操作,如下例:
    mysql> create table t5 (c1 char(3));
    mysql> insert into t5 values('abcd');
    mysql> select * from t5;
    +------+
    | c1   |
    +------+
    | abc  |
    +------+
    1 row in set (0.00 sec)

我们发现插入的字符被自动截断了,但是如果我们本意希望如果长度超过限制就报错,那么我们可以设置sql_mode为STRICT_TRANS_TABLES,如下:
    mysql> set session sql_mode='STRICT_TRANS_TABLES'
这样我们再执行同样的操作,mysql就会告诉我们插入的值太长,操作被终止,如下:
    mysql> insert into t5 values('abcd');
    ERROR 1406 (22001): Data too long for column 'c1' at row 1

经常使用的sql_mode值

Sql_mode值 描述
ANSI 更改语法和行为,使其更符合标准SQL。
STRICT_TRANS_TABLES 如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。本节后面给出了更详细的描述。
TRADITIONAL Make MySQL的行为象“传统”SQL数据库系统。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。注释:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。
说明:如果把sql_mode的值设置成后面的两个值(也就是我们说的严格模式),那么当在列中插入或更新不正确的值时,mysql将会给出错误,并且放弃insert/update操作。在我们的一般应用中建议使用这两种模式,而不是使用默认的空或ANSI模式。但是需要注意的问题是,如果数据库运行在严格模式下,并且你的存储引擎不支持事务,那么有数据不一致的风险存在,比如一组sql中有两个dml语句,如果后面的一个出现了问题,但是前面的已经操作成功,那么mysql并不能回滚前面的操作。因此说设置sql_mode需要应用人员权衡各种得失,从而得到一个合适的选择。

Sql_mode的值还有很多,这里不再累述,可以参考相关的手册。
SQL Mode与可移植性

如果mysql与其它异构数据库之间有数据移植的需求的话,那么下面的sql_mode的组合设置可以达到相应的效果:
数据库 Sql_mode值
DB2 PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS
MAXDB PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、 NO_AUTO_CREATE_USER
MSSQL PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS
ORACLE PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS、NO_AUTO_CREATE_USER
POSTGRESQL PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS、NO_FIELD_OPTIONS 
SQL Mode与数据效验

SQL Mode 还可以实现对数据效验和转移等功能如:
效验日期数据合法性.
在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误
将‘"’视为识别符引号(‘`’引号字符)
禁用反斜线字符(‘\’)做为字符串内的退出字符。启用NO_BACKSLASH_ESCAPES模式,反斜线则成为普通字符。
将||视为字符串连接操作符(+)(同CONCAT()),而不视为OR。
分享到:
评论

相关推荐

    Mysql之SQL Mode用法详解

    MySQL中的SQL Mode是一个非常重要的配置选项,它定义了MySQL服务器如何解释和执行SQL语句,以及在数据验证方面遵循的规则。SQL Mode的设定可以根据不同的应用场景进行调整,以适应多种需求,包括兼容其他数据库系统...

    MySQL中SQL Mode的查看与设置详解

    MySQL中的SQL Mode是一种非常重要的配置,它决定了数据库服务器在处理SQL语句时的行为。SQL Mode定义了一组规则,这些规则会影响MySQL如何解释和执行SQL语句,包括数据验证、默认值处理、日期时间格式以及一些兼容性...

    mysql中的sql_mode模式实例详解

    本文实例讲述了mysql中的sql_mode模式。分享给大家供大家参考,具体如下: mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode:...

    关于MySQL的sql_mode合理设置详解

    MySQL的`sql_mode`是数据库服务器的一个关键配置项,它定义了MySQL如何处理不符合标准SQL的行为,以及在数据验证和插入方面遵循何种规则。合理的设置`sql_mode`可以帮助确保数据的准确性,避免潜在的问题,特别是在...

    mysql安装步骤详解

    13. **标准模式**:考虑是否启用"Enable Strict Mode",这将严格检查SQL语法,减少潜在的错误。 完成以上步骤后,配置向导会创建必要的配置文件,如my.ini,并启动MySQL服务。至此,MySQL已经成功安装并配置完毕,...

    解决MySQL 5.7.9版本sql_mode=only_full_group_by问题

    通过阅读MySQL文档和相关的技术文章,如“Mysql之SQL Mode用法详解”、“MySQL5.7中的sql_mode默认值带来的坑及解决方法”等,可以深入理解各种SQL模式的作用和应用场景,从而更好地优化和维护你的数据库系统。

    mysql 参考手册(详解关键字的功能和涉及到的问题)

    首先,MySQL的关键字是数据库语言SQL中的重要组成部分,它们用于执行各种数据库操作,如创建、查询、更新和删除数据。例如,“CREATE DATABASE”用于创建新的数据库,而“SELECT”用于从表中检索数据。“UPDATE”则...

    MySQL模式 Strict Mode知识点详解

    如使用MySQL API,可以添加`mysql_query("SET @@sql_mode = ''")`;如果使用mysqli,则是`mysqli_query($this->connection_id, "SET @@sql_mode = ''")`。 总之,MySQL的Strict Mode提升了数据处理的严谨性,有助于...

    mysql 5.0_18的安装详解

    这会更严格地检查SQL语法,对于新手可能带来困扰,但对于提高数据库的健壮性很有帮助。 完成上述步骤后,配置向导会自动创建必要的配置文件(如my.ini),并启动MySQL服务。至此,MySQL 5.0_18已在你的系统上成功...

    MySQL配置文件mysql.ini参数详解.docx

    6. **sql-mode**:设置SQL执行模式,例如严格的事务表模式。 7. **max_connections**:MySQL服务器支持的最大并发连接数。值得注意的是,无论此值如何设置,都会保留一个额外的连接供管理员使用超级权限登录。 8. **...

    window系统下如何进行mysql离线安装

    Window系统下MySQL离线安装详解 MySQL是一款非常流行的开源关系数据库管理系统,广泛应用于Web应用程序中。然而,在Windows系统下安装MySQL却是一个让人头疼的问题,本文将详细介绍如何在Window系统下进行MySQL离线...

    [全]MySQL5.7升级到8.0过程详解.docx

    3. **SQL模式**:在MySQL 8.0中,`sql_mode`有了更严格的默认设置,如`NO_AUTO_CREATE_USER`,这限制了自动创建用户的能力,增强了安全性。 4. **JSON支持**:MySQL 8.0引入了对JSON数据类型的原生支持,使得处理非...

    Mycat高可用以及mycat实现mysql高可用以及mycat的mysql主从配置,负载均衡,读写分离,以及验证查询sql具体执行在主库还是从库上

    Mycat高可用和Mycat实现MySQL高可用详解 Mycat高可用是通过KP+HA实现的,而MySQL高可用是通过Mycat实现的。下面将详细讲解Mycat高可用和Mycat实现MySQL高可用。 一、Mycat高可用 Mycat高可用是通过KP+HA实现的,...

    MySQL高效导入多个.sql文件方法详解

    相比之下,`source`命令在MySQL命令行内部执行,适合于将多个.sql文件内容合并到一个文件(如all.sql)中,然后一次性执行。例如,all.sql中包含如下内容: ```sql source user1.sql source user2.sql source user3...

Global site tag (gtag.js) - Google Analytics