首页 > 数据库 >MySql sql_mode

MySql sql_mode

时间:2023-01-30 17:33:34浏览次数:48  
标签:NO sql 模式 ZERO mode MySql DATE

sql_mode默认值是空值,在默认值设置下是可以允许一些非法操作,比如允许写入一些非法数据,在生产环境中,必须将sql_mode设置为严格模式

mysql支持的sql_mode模式:ANSI、TRADITIONAL、STRICT_ALL_TABLES和STRICT_TRANS_TABLES。

  ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
  TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
  STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。只对支持事务的表有效。
  STRICT_ALL_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。对所有表都有效。

5.6 https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_sql_mode

Command-Line Format --sql-mode=name
System Variable sql_mode
Scope Global, Session
Dynamic Yes
Type Set
Default Value NO_ENGINE_SUBSTITUTION
Valid Values

ALLOW_INVALID_DATES

ANSI_QUOTES

ERROR_FOR_DIVISION_BY_ZERO

HIGH_NOT_PRECEDENCE

IGNORE_SPACE

NO_AUTO_CREATE_USER

NO_AUTO_VALUE_ON_ZERO

NO_BACKSLASH_ESCAPES

NO_DIR_IN_CREATE

NO_ENGINE_SUBSTITUTION

NO_FIELD_OPTIONS

NO_KEY_OPTIONS

NO_TABLE_OPTIONS

NO_UNSIGNED_SUBTRACTION

NO_ZERO_DATE

NO_ZERO_IN_DATE

ONLY_FULL_GROUP_BY

PAD_CHAR_TO_FULL_LENGTH

PIPES_AS_CONCAT

REAL_AS_FLOAT

STRICT_ALL_TABLES

STRICT_TRANS_TABLES

 

5.7 https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_mode

Command-Line Format --sql-mode=name
System Variable sql_mode
Scope Global, Session
Dynamic Yes
Type Set
Default Value 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
Valid Values

ALLOW_INVALID_DATES

ANSI_QUOTES

ERROR_FOR_DIVISION_BY_ZERO

HIGH_NOT_PRECEDENCE

IGNORE_SPACE

NO_AUTO_CREATE_USER

NO_AUTO_VALUE_ON_ZERO

NO_BACKSLASH_ESCAPES

NO_DIR_IN_CREATE

NO_ENGINE_SUBSTITUTION

NO_FIELD_OPTIONS

NO_KEY_OPTIONS

NO_TABLE_OPTIONS

NO_UNSIGNED_SUBTRACTION

NO_ZERO_DATE

NO_ZERO_IN_DATE

ONLY_FULL_GROUP_BY

PAD_CHAR_TO_FULL_LENGTH

PIPES_AS_CONCAT

REAL_AS_FLOAT

STRICT_ALL_TABLES

STRICT_TRANS_TABLES

8.0 https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_sql_mode

Command-Line Format --sql-mode=name
System Variable sql_mode
Scope Global, Session
Dynamic Yes
SET_VAR Hint Applies Yes
Type Set
Default Value ONLY_FULL_GROUP_BY STRICT_TRANS_TABLES NO_ZERO_IN_DATE NO_ZERO_DATE ERROR_FOR_DIVISION_BY_ZERO NO_ENGINE_SUBSTITUTION
Valid Values

ALLOW_INVALID_DATES

ANSI_QUOTES

ERROR_FOR_DIVISION_BY_ZERO

HIGH_NOT_PRECEDENCE

IGNORE_SPACE

NO_AUTO_VALUE_ON_ZERO

NO_BACKSLASH_ESCAPES

NO_DIR_IN_CREATE

NO_ENGINE_SUBSTITUTION

NO_UNSIGNED_SUBTRACTION

NO_ZERO_DATE

NO_ZERO_IN_DATE

ONLY_FULL_GROUP_BY

PAD_CHAR_TO_FULL_LENGTH

PIPES_AS_CONCAT

REAL_AS_FLOAT

STRICT_ALL_TABLES

STRICT_TRANS_TABLES

TIME_TRUNCATE_FRACTIONAL

sql_mode值说明如下:

  ALLOW_INVALID_DATES:字母意思允许不合法的数据。不对日期做全面的检查,仅仅检查月份是否在1~12之间,天数是否在1~31之间;这种模式可能是有用的对web应用来说去获取年,月,日在三个不同的字段并且准确存储用户的输入数值,没有验证数据的合法性。这种模式对date和datetime类型有作用,但是对timestamp类型不起作用,timestamp总是要合法的数据。当ALLOW_INVALID_DATES启用时,服务端要求年和月时合法的。如果strict模式禁用,不合法的数据如"2004-04-31"被存储为"0000-00-00"并且审查警告;若严格模式启用则会生成错误。(测试的时候,数据时原样插入的,没有转换为0000-00-00)


  ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符。


  ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被清零,则产生错误而非警告。如果未给出该模式,那么数据被清零时,MySQL返回NULL。


  HIGH_NOT_PRECEDENCE: (高not优先级):在如下一个表达式中not a between b and c,在当前设置下被解析为not (a between b and c),在旧的行为中同一个表达式被解析为(not a) between b and c;启用了HIGH_NOT_PRECEDENCE这个模式,就是启用来旧的优先级设置,表达式将被解析为后一种行为。


  IGNORE_SPACE:用于忽略mysql系统函数名与之后的括号之间的空格、列如:count (*) 通过设置ignore_space 这个sql_mode 就可以把空格给忽略变成count(*)


  NO_AUTO_CREATE_USER:禁止grant语句自动创建用户,除非认证信息被指定,语句必须包含一个非空的密码使用identified by或使用认证插件identified with.


  NO_AUTO_VALUE_ON_ZERO:该模式影响自增列的插入。在默认设置下,插入 0 或 NULL 代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长值,那么该模式就起作用了。


  NO_BACKSLASH_ESCAPES:(禁用反斜线转义)这个模式启用,反斜线将会变成一个普通的字符串。


  NO_DIR_IN_CREATE:在创建表时忽略所有的index directory和data directory选项。


  NO_ENGINE_SUBSTITUTION:此模式指定当执行create语句或者alter语句指定的存储引擎没有启用或者没有编译时,控制默认默认存储引擎的自动切换。默认是启用的。当NO_ENGINE_SUBSTITUTION被禁用,当create表时的默认存储引擎不可使用则产生警告信息,对于alter语句产生警告并且表不会被alter。当NO_ENGINE_SUBSTITUTION启用,会生成错误并且表不会被创建或alter如果期望的存储引擎不可用。


  NO_FIELD_OPTIONS:不要在SHOW CREATE TABLE的输出中打印MySQL专用列选项。该模式在可移植模式(portability mode)下用于mysqldump。


  NO_KEY_OPTIONS:不要在SHOW CREATE TABLE的输出中打印MySQL专用索引选项。该模式在可移植模式(portability mode)下用于mysqldump。


  NO_TABLE_OPTIONS:不要在SHOW CREATE TABLE的输出中打印MySQL专用表选项(例如ENGINE)。该模式在可移植模式(portability mode)下用于mysqldump。


  NO_UNSIGNED_SUBTRACTION: 在整型数值之间的减法,一个值得类型是unsigned的,那么默认结果也是unsigned的。若是结果是一个负数,则会产生一个错误。 NO_ZERO_DATE:这个模式影响着插入的'0000-00-00'值是否作为合法的数值,这个结果和是否启用严格模式有关。如果这个模式禁用,则'0000-00-00'被允许并且插入没有警告,如果这个模式启用,则'0000-00-00'被运行并且插入产生一个警告信息;如果这个模式和严格模式被启用,则'0000-00-00'不被允许并且插入产生错误,除非ignore被使用。  NO_ZERO_DATE不是严格模式的一部分,应该和严格模式一起被使用。因为NO_ZERO_DATE将会被放弃在将来的mysql中,它的影响将会被包含进严格模式中。 NO_ZERO_IN_DATE:这个模式影响着日期中的月份和天数是否可以为0(注意年份是非0的),这个模式也取决于严格模式是否被启用。如果这个模式未启用,date中的零部分被允许并且插入没有警告。如果这个模式启用,dates中的零部分插入被作为“0000-00-00”并且产生一个警告。如果这个模式和严格模式被启用,则dates中的零部分不被允许并且插入产生错误,除非ignore也被使用。这个模式也不是严格模式的一部分,应该和严格模式一起被使用。


  ONLY_FULL_GROUP_BY:这个模式对查询的影响有点大。mysql5.7默认启用这个模式,这个模式是指在mysql的select查询不能出现除group by语句字段之外的其余字段。


  PAD_CHAR_TO_FULL_LENGTH:虽然char 和 varchar 的存储方式不太相同,但是对两个字符串的比较,都只比较其值,忽略CHAR值存在的右填充,即使将SQL_MODE设置为PAD_CHAR_TO_FULL_LENGTH 也一样,但这不适用于like


  PIPES_AS_CONCAT:将“||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似


  REAL_AS_FLOAT:将real作为float的同义词。默认的,mysql将real作为double的同义词

标签:NO,sql,模式,ZERO,mode,MySql,DATE
From: https://www.cnblogs.com/liuxiaoji/p/17076602.html

相关文章

  • SQL、LINQ、Lambda对照表
    SQL、LINQ、Lambda对照表SQLLINQLambdaSELECT*FROMEmployeefromeinEmployeesselecteEmployees.Select()SELECTe.LoginID,e.JobTitleFROMEmployee......
  • SQL Server 安装、配置、迁移 三
    本片博文记录数据迁移。两台电脑,一台IP地址为:10.15.66.168,有名为TestprgDB的数据库,另一台IP地址10.15.66.169,无数据库。本次任务目的为把168电脑的数据库拷贝到169电脑。......
  • Sql语句的执行数据是什么?
    SQLSelect语句完整的执行顺序:1、from子句组装来自不同数据源的数据;2、where子句基于指定的条件对记录行进行筛选;3、groupby子句将数据划分为多个分组;4、使用聚集函数......
  • mysql8.0远程访问配置
    mysql8.0远程访问配置一、修改bind-address查找配置文件my.confwhichmysql/usr/bin/mysql--verbose--help|grep-A1'Defaultoptions'vimy.cnfbind-addres......
  • 【Amadeus原创】MySQL8设置root用户远程访问
    1.查询当前root状态,默认root的host是localhostusemysql;selectuser,hostfromuser;2.updateroot的host为%updateusersethost='%'whereuser='root';3.检查客......
  • SQL Server 安装、配置、迁移 二
    本篇博客记录网络配置。本机IP地址:10.15.66.169打开配置界面,如图所示设置TCP/IP为Enabled。双击TCP/IP,出现TCP/IPProperties窗口。选择一个指向本......
  • mysqldump 造成阻塞问题
    备份命令点击查看代码mysqldump-hxxxx-xxxx-P${PORT}-p${Pass}-R-e--triggers--master-data=2--single-transaction--set-gtid-purged=OFF--skip-add-drop......
  • 15.1 SQL Server创建LOGIN(登录)
    SQLServer创建LOGIN(登录)目录SQLServer创建LOGIN(登录)简介示例SQLServerCREATELOGIN语句更多选项CHECK_POLICY选项CHECK_EXPIRATION选项MUST_CHANGE选项从Windows域帐......
  • centos7.9离线安装mysql5.7.40(本文使用initialize-insecure安装方法)
    centos7.9离线安装mysql5.7.40(本文使用initialize-insecure安装方法)一、卸载CentOS7系统自带mariadb#查看系统自带的Mariadb[root@NIWAY-190~]#rpm-qa|grepmariadbm......
  • Servlet+MySQL
    前后端调通后可以把数据存到数据库里了1.下载并配置SQLWindows中MySQL8详细安装教程2.netstart/stopmysql启动/关闭mysql,在管理员身份下运行3.mysql的可视化软件......