暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
11.SQL MODE参数用法.docx
99
15页
0次
2024-08-03
50墨值下载
SQL Mode 简介
与其他数据库不同,MySQL 可以运行不同的 SQL Mode 下。SQL Mode MySQL 的一个
系统变量,用于设置服务器对 SQL 语句的解析和执行规则。它可以影响 MySQL 的行为,包
括语法规范、数据校验、数据类型转换和错误处理等,这样可以更容易地在不同的环境中使用
MySQL
下表总结出了常用的 SQL Mode 值及其说明。
sql_mode
描述
ANSI
ANSI 模式包含
REAL_AS_FLOATPIPES_AS_CONCATANSI_QUOTESIGNORE_SPACEONLY_FULL_GROUP_BY
模式,这种模式使语法和行为更符合标准的 SQL
TRADITIONA
L
TRADITIONAL 模式包含
STRICT_TRANS_TABLESSTRICT_ALL_TABLESNO_ZERO_IN_DATENO_ZERO_DATE
N_BY_ZEROTRADITIONAL NO_ENGINE_SUBSTITUTION 组合模式,所以它是严格模式,对于插入不正确的值是给出错
误而不是警告。
下面通过一个简单的实例,让大家了解如何使用 SQL Mode 实现数据校验。
1)查看默认 SQL Mode 的命令如下:
mysql> select @@sql_mode;
+----------------------------------------------------------------------------------------------------------
-------------+
| @@sql_mode |
+----------------------------------------------------------------------------------------------------------
-------------+
|
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZE
RO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+----------------------------------------------------------------------------------------------------------
-------------+
1 row in set (0.00 sec)
1. ONLY_FULL_GROUP_BYSELECT 后面的字段必须出现在 group by 后面,否
则会报错。
2. STRICT_TRANS_TABLES:严格模式,不允许非法日期,也不允许超过字段长度
的值插入字段中,对于插入不正确的值给出错误而不是警告。
3. NO_ZERO_IN_DATE:不接受月或日部分为 0 的日期。
4. NO_ZERO_DATE 不接受将 '0000-00-00'做为合法日期。
5. ERROR_FOR_DIVISION_BY_ZERO:在 INSERT UPDATE 过程中,如果被
零除( MOD(X, 0)),则产生错误。
6. NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出
错误。
2)创建测试表 t31
create table t31(id int,name varchar(20));
3)在表 t31 中插入一条记录,其中 name 故意超出了实际的定义值 varchar20):
mysql> insert into t31 values(1,'12340000000000000000999999');
ERROR 1406 (22001): Data too long for column 'name' at row 1
结果发现,记录没有插入成功,给出了一个 ERROR
4)接下来设置 SQL Mode ANSI 模式:
mysql> set sql_mode='ANSI';
Query OK, 0 rows affected (0.01 sec)
mysql> select @@sql_mode;
+--------------------------------------------------------------------------------+
| @@sql_mode |
+--------------------------------------------------------------------------------+
|
REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_F
ULL_GROUP_BY,ANSI |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
REAL_AS_FLOAT:启用 REAL_AS_FLOAT 模式,那 么,MySQL 就认为 REAL
FLOAT
PIPES_AS_CONCAT:启用 PIPES_AS_CONCAT 模式。MySQL 将“||”视为字符串连接
操作符。
ANSI_QUOTES默认情况下,MySQL 使用反引号(`)作为标识符的引号。使用 mysql
键字作为表名、字段名会报语法错误,这时可以加上反引号( `),避免报错。启用
ANSI_QUOTES 后,使用双引号(")作为标识符的引号。
IGNORE_SPACE:启用 IGNORE_SPACE 模式,MySQL 可以忽略 SQL 语句中的空格,
因此 SQL 语句可以更加灵活。
ONLY_FULL_GROUP_BYSELECT 后面的字段必须出现在 group by 后面,否则会报错。
5)再次尝试插入上面的测试记录:
mysql> insert into t31 values(1,'12340000000000000000999999');
Query OK, 1 row affected, 1 warning (0.00 sec)
可以发现,记录可以插入,但是显示了一个 warning,查看 warning 内容:
mysql> show warnings;
+---------+------+-------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------+
| Warning | 1265 | Data truncated for column 'name' at row 1 |
+---------+------+-------------------------------------------+
1 row in set (0.00 sec)
5warning 提示对插入的 name 值进行了截断,从表 t31 中查看实际插入值:
mysql> select * from t31;
+------+----------------------+
| id | name |
+------+----------------------+
of 15
50墨值下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜