(一) 基本介绍
sql_mode="",即强制不设定MySql模式(如不作输入检测、错误提示、语法模式检查等)应该能提高性能,但有如下问题:
如果插入了不合适数据(错误类型或超常),mysql会将数据设为“最好的可能数据”而不报错,如:
/数字 设为:0/可能最小值/可能最大值
/字符串 设为:空串/能够存储的最大容量字符串
/表达式 设为:返回一个可用值(1/0-null)
所以,解决办法是:所有列都要采用默认值,这对性能也好。
当然,如果你特别喜欢sqlserver的模式,也可以设置为sql_mod="sqlserver"(好像是这么写的),这样mysql就按sqlserver的方式运作了,建议不要如此。
(二) 常见方式
mysql可以运行在不同sql mode模式下面,sql mode模式定义了mysql应该支持的sql语法,数据校验等!
查看默认的sql mode模式:
select @@sql_mode;
我的数据库是:
STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
在此模式下面,如果插入的数据的长度大于定义的长度,那么就会报错!
set session sql_mode='REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI';
在这种模式下面:插入的数据的长度大于定义的时候,就会截取,并警告,但是可以插入进去
session表示只在本次中有效
global:表示在本次连接中不生效,而对于新的连接就生效
启用NO_BACKSLASH_ESCAPES模式,使反斜线成为普通字符,在导入数据时候,如果数据中有反斜线,启用这个模式是个不错的选择
启用PIPES_AS_CNCAT模式,将||看成是普通字符串
sql mode值 说明
ANSI
'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE和ANSI组合',
这种模式使语法 和行为更 符合标准的sql
STRICT_TRANS_TABLES 使用与事务和非事务表,严格模式
TRADITIONAL 也是严格模式,对于插入不正确的值给出错误而不是警告。用在事务时,只要发生错误就立即回滚
(三) 修改sql_mode 解决问题
今天安装了个mysql5.0,拿了一个很久之前网上下的程序检查一下是否工作正常.
发现以前的程序居然不能正常运行,提示信息如下:
Database error: Invalid SQL: INSERT INTO Survey_UserHistory(userId,jobId,type,action,startTime,endTime) VALUES(’17′,”,’User’,'Login’,”,’2008-11-23 14:33:56′)
MySQL error: 1366 (Incorrect integer value: ” for column ‘jobId’ at row 1)
Session halted.
第一时间的反应是跟mysql5.0新加的sql-mode有关系,因为前一阵子刚刚看过手册.果然,作了如下更改后就不再提示了.
修改 my.ini 文件.
# Set the SQL mode to strict
sql-mode=”STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
改为:
# Set the SQL mode to strict
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”
分享到:
相关推荐
本文主要内容是MySQL升级到5.7版本之后,由于默认的 sql_mode 值带来的坑以及对应的解决方案。 案例一:ONLY_FULL_GROUP_BY 问题描述 MySQL版本从5.6升级至5.7之后,部分SQL执行报错,报错信息如下: ERROR 1055 ...
本文实例讲述了mysql中的sql_mode模式。分享给大家供大家参考,具体如下: mysql数据库的中有一个环境变量sql_mode,定义了mysql应该支持的sql语法,数据校验等!我们可以通过以下方式查看当前数据库使用的sql_mode:...
1、查看sql_mode select @@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 2、去掉...
`sql_mode`的设置可以影响MySQL对语法的严格性、错误处理方式、日期有效性检查、函数调用规则等多个方面。 在MySQL中,`sql_mode`为空或者设置为`""`意味着不启用任何特定的SQL模式,这通常会放宽一些检查,提高...
MySQL的`sql_mode`是数据库服务器的一个关键配置项,它定义了MySQL如何处理不符合标准SQL的行为,以及在数据验证和插入方面遵循何种规则。合理的设置`sql_mode`可以帮助确保数据的准确性,避免潜在的问题,特别是在...
NULL 博文链接:https://yixinhu.iteye.com/blog/1534691
MySQL中的`sql_mode`是一个非常重要的配置选项,用于定义服务器在处理SQL语句时的行为模式。`sql_mode`可以包含多个模式,每个模式代表一种特定的行为规则,这些规则会影响MySQL如何解析和执行SQL语句,以及在遇到不...
通过阅读MySQL文档和相关的技术文章,如“Mysql之SQL Mode用法详解”、“MySQL5.7中的sql_mode默认值带来的坑及解决方法”等,可以深入理解各种SQL模式的作用和应用场景,从而更好地优化和维护你的数据库系统。
这是新建的一个测试表,同一天,同一时刻的有两条数据 ...set sql_mode = (SELECT REPLACE(@@sql_mode, ‘ONLY_FULL_GROUP_BY’, ‘’)); %y:表示显示两位的年份 %m:表示月份 %d:表示天数 这样就可以了。DATE_FORMAT()
MySQL的`sql_mode`是一个非常重要的配置选项,它定义了MySQL服务器处理SQL语句的方式,包括语法、数据验证和行为等方面。理解并正确设置`sql_mode`有助于确保数据的完整性和一致性,同时也可以提高与其他数据库系统...
MySQL中的SQL Mode是一种非常重要的配置,它决定了数据库服务器在处理SQL语句时的行为。SQL Mode定义了一组规则,这些规则会影响MySQL如何解释和执行SQL语句,包括数据验证、默认值处理、日期时间格式以及一些兼容性...
MySQL的InnoDB存储引擎在处理自动递增列(auto_increment)时,会受到`innodb_autoinc_lock_mode`参数的影响。这个参数决定了在插入数据时如何管理自动递增锁,从而影响性能和数据一致性。接下来,我们将深入探讨这...
在MySQL数据库中,`SQL_MODE` 是一个至关重要的设置,它定义了服务器执行SQL语句的行为和严格性。`SQL_MODE` 可以控制多种不同的SQL标准和模式,以适应不同的应用需求,尤其是在数据迁移时,它能确保数据在源数据库...
sql_mode 是 MySQL 的一个系统变量,它控制着 MySQL 的行为。可以使用以下命令来查看当前的 sql_mode 值: mysql> show variables like '%sql_mode%'; +---------------+----------------------------------------...