您的位置:首页 > 产品设计 > UI/UE

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"

2016-02-24 13:12 656 查看
NO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列的处理。一般情况,你可以向该列插入NULL或0生成下一个序列号。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一个序列号。

如果将0保存到表的AUTO_INCREMENT列,该模式会很有用。(不推荐采用该惯例)。例如,如果你用mysqldump转储表并重载,MySQL 遇到0值一般会生成新的序列号,生成的表的内容与转储的表不同。重载转储文件前启用NO_AUTO_VALUE_ON_ZERO可以解决该问题。

参考学习  sql mode

sql_mode="",即强制不设定MySql模式(如不作输入检测、错误提示、语法模式检查等)应该能提高性能,但有如下问题:

如果插入了不合适数据(错误类型或超常),mysql会将数据设为“最好的可能数据”而不报错,如:

/数字 设为:0/可能最小值/可能最大值

/字符串 设为:空串/能够存储的最大容量字符串

/表达式 设为:返回一个可用值(1/0-null)

所以,解决办法是:所有列都要采用默认值,这对性能也好。

mysql_mode的详细描述:

在mysql 5中,默认的是REAL_AS_FLOAT,PIPES_AS_CONTACT,ANSI_QUOTES,GNORE_SPACE和ANSI,

在这种模式下,允许插入超过字段长度的值,只是插入后,返回的是警告而不是错误,当用STRICT_TRANS_TABLES时,

则是错误了,严格的警告.

NO_AUTO_CREATE_USER
防止GRANT自动创建新用户,除非还指定了密码。 下面是手册中的一些介绍 下面描述了支持的所有模式: ·
ALLOW_INVALID_DATES 在严格模式下不要检查全部日期。只检查1到12之间的月份和1到31之间的 日。这在Web应用程序中,当你从三个不同的字段获取年、月、日,并且想要确切保存用户插入的内容(不进行日期验证)时很重要。该模式适用于DATE和
DATETIME列。不适合TIMESTAMP列,TIMESTAMP列需要验证日期。 启用严格模式后,服务器需要合法的月和日,不仅仅是分别在1到12和1到31范围内。例如,禁用严格模式时’2004-04-31′是合法的,但启用严格模式后是非法的。要想在严格模式允许遮掩固定日期,还应启用ALLOW_INVALID_DATES。 ·
ANSI_QUOTES将‘”’视为识别符引号(‘`’引号字符),不要视为字符串的引号字符。在ANSI模式,你可以仍然使用‘`’来引用识别符。启用ANSI_QUOTES后,你不能用双引号来引用字符串,因为它被解释为识别符。 ·
ERROR_FOR_DIVISION_BY_ZERO 在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT
IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。 · HIGH_NOT_PRECEDENCE NOT
操作符的优先顺序是表达式例如NOT a BETWEEN b AND c被解释为NOT (a BETWEEN b AND c)。在一些旧版本MySQL中, 表达式被解释为(NOT a) BETWEEN b AND c。启用HIGH_NOT_PRECEDENCESQL模式,可以获得以前的更高优先级的结果。
mysql>SET sql_mode = ‘’;

mysql>SELECT NOT 1 BETWEEN -5 AND 5;

-> 0

mysql>SET sql_mode = ‘broken_not’;

mysql>SELECT NOT 1 BETWEEN -5 AND 5;

-> 1

· IGNORE_SPACE 允许函数名和‘(’之间有空格。强制将所有函数名视为保存的字。结果是,如果你想要访问保存为字的数据库、表或列名,你必须引用它。例如,因为有USER()函数,mysql数据库中的user表名和该表内的User列被保存下来,因此你必须引用它们:
SELECT "User" FROM mysql."user";

· NO_AUTO_CREATE_USER 防止GRANT自动创建新用户,除非还指定了密码。 ·
NO_AUTO_VALUE_ON_ZERONO_AUTO_VALUE_ON_ZERO影响AUTO_INCREMENT列的处理。一般情况,你可以向该列插入NULL或0生成下一个序列号。NO_AUTO_VALUE_ON_ZERO禁用0,因此只有NULL可以生成下一个序列号。 如果将0保存到表的AUTO_INCREMENT列,该模式会很有用。(不推荐采用该惯例)。例如,如果你用mysqldump转储表并重载,MySQL遇到0值一般会生成新的序列号,生成的表的内容与转储的表不同。重载转储文件前启用NO_AUTO_VALUE_ON_ZERO可以解决该问题。mysqldump在输出中自动包括启用NO_AUTO_VALUE_ON_ZERO的语句。 ·
NO_BACKSLASH_ESCAPES 禁用反斜线字符(‘’)做为字符串内的退出字符。启用该模式,反斜线则成为普通字符。 ·
NO_DIR_IN_CREATE 创建表时,忽视所有INDEX DIRECTORY和DATA DIRECTORY指令。该选项对从复制服务器有用。 ·
NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql