在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

MySQL的SQL模式介绍

112次阅读
没有评论

共计 9601 个字符,预计需要花费 25 分钟才能阅读完成。

这篇文章主要讲解了“MySQL 的 SQL 模式介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着丸趣 TV 小编的思路慢慢深入,一起来研究和学习“MySQL 的 SQL 模式介绍”吧!

MySQL 服务器能够在运行在不同的 SQL 模式下,并且能在不同客户端下设置不同的 SQL 模式,可以通过 sql_mode 系统参数来设定 SQL 模式。
SQL 模式会影响 MySQL 支持的 SQL 语法和数据的验证。

MariaDB [test] select @@sql_mode;
+——————————————–+
| @@sql_mode                                 |
+——————————————–+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+——————————————–+
1 row in set (0.08 sec)

NO_AUTO_CREATE_USER
防止通过 GRANT 语句创建没有密码的数据库账户。在通过 GRANT 创建用户时,必须在 IDENTIFIED BY 后指定非空的密码。建议使用 CREATE USER 语句创建数据库账户,尽量避免使用 GRANT 语句来创建数据库账户。

NO_ENGINE_SUBSTITUTION
当执行 CREATE TABLE 或 ALTER TABLE 语句,指定了一个不支持或没有编译的存储引擎时,控制如何自动替换默认的存储引擎。
当 NO_ENGINE_SUBSTITUTION 参数没有启用时,对于 CREATE TABLE 语句,如果指定的存储引擎不可用,会使用默认的存储,且会产生一个警告。对于 ALTER TABLE 语句,会产生一个警告,且表的存储引擎转化失败。
当 NO_ENGINE_SUBSTITUTION 参数启用时,如果指定的存储引擎不可用,会发生报错,且表不会创建或更改成功。

– 最重要的 SQL 模式

ANSI
这个模式改变 SQL 的语法和行为以更接近标准的 SQL。

STRICT_TRANS_TABLES
如果值不能插入到事务表中,则退出这条语句;对于非事务表,如果插入或更新的值发生在一行的 SQL 或多行语句的第一行中,则退出语句。

TRADITIONAL
当插入一个错误的值到一列中时,MySQL 会报错而不是警告。

–SQL 模式的结合

有一些特殊的 SQL 模式是一些 SQL 结合在一起的缩写

例如,ANSI 是 REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE,ONLY_FULL_GROUP_BY(MySQL 5.7.5)模式的结合;
DB2 是 PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS 模式的结合。

– 严格 SQL 模式

严格模式控制 MySQL 如何处理数据改变 SQL 语句(例如 INSERT 或 UPDATE)中无效或丢失的值。插入或更新的值无效有许多原因,例如,有可能因为字段的数据类型,或值超过了字段的最大范围值。对于一个非空字段,当要插入的一个值为空,且没有默认值,这是值丢失。严格模式也会影响 DDL 语句,例如 CREATE TABLE。

如果严格模式没有生效,对于无效或丢失的值,MySQL 会插入调整的值。在严格模式下,可以通过 INSERT IGNORE 或 UPDATE IGNORE 语句来跳过错误。

在严格模式下,对于类似 SELECT 这样不改变数据的语句,无效的值会产生一个警告,而不是错误。在严格模式下,对于插入或更新超过字段最大长度的值,会产生一个错误;而在非严格模式下,会产生一个警告,并将截断后的值插入或更新到表中。

严格模式不会影响是否外键验证。可以通过 foreign_key_checks 参数来验证外键。

MariaDB [test] show variables like %foreign%
+——————–+——-+
| Variable_name      | Value |
+——————–+——-+
| foreign_key_checks | ON    |
+——————–+——-+
1 row in set (0.00 sec)

– 示例①
严格 SQL 模式

MariaDB [test] select @@sql_mode;
+——————————————–+
| @@sql_mode                                 |
+——————————————–+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+——————————————–+
1 row in set (0.08 sec)

MariaDB [test] create table t (name varchar(20), email varchar(40));
Query OK, 0 rows affected (0.21 sec)

MariaDB [test] insert into t values(1234567890000000000000000000 , fire beijing @ hotmail.com
Query OK, 1 row affected, 1 warning (0.00 sec)

MariaDB [test] show warnings;
+———+——+——————————————-+
| Level   | Code | Message                                   |
+———+——+——————————————-+
| Warning | 1265 | Data truncated for column name at row 1 |
+———+——+——————————————-+
1 row in set (0.00 sec)

MariaDB [test] select * from t;
+———————-+—————————-+
| name                 | email                      |
+———————-+—————————-+
| 12345678900000000000 | fire beijing @ hotmail.com |
+———————-+—————————-+
1 row in set (0.00 sec)

MariaDB [test] set session sql_mode= STRICT_TRANS_TABLES
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] select @@sql_mode;
+———————+
| @@sql_mode          |
+———————+
| STRICT_TRANS_TABLES |
+———————+
1 row in set (0.00 sec)

MariaDB [test] insert into t values(1234567890000000000000000000 , fire beijing @ hotmail.com
ERROR 1406 (22001): Data too long for column name at row 1

– 示例②
ANSI 模式和传统模式的区别

MariaDB [test] set session sql_mode= ANSI
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] select @@sql_mode;
+————————————————————-+
| @@sql_mode                                                  |
+————————————————————-+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+————————————————————-+
1 row in set (0.00 sec)

MariaDB [test] drop table t;
Query OK, 0 rows affected (0.13 sec)

MariaDB [test] create table t(d datetime);
Query OK, 0 rows affected (0.21 sec)

MariaDB [test] insert into t values(2007-04-31
Query OK, 1 row affected, 1 warning (0.01 sec)

MariaDB [test] select * from t;
+———————+
| d                   |
+———————+
| 0000-00-00 00:00:00 |
+———————+
1 row in set (0.00 sec)

MariaDB [test] set session sql_mode= TRADITIONAL
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] select @@sql_mode;
+——————————————————————————————————————————————————+
| @@sql_mode                                                                                                                                           |
+——————————————————————————————————————————————————+
| STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+——————————————————————————————————————————————————+
1 row in set (0.00 sec)

MariaDB [test] insert into t values(2007-04-31
ERROR 1292 (22007): Incorrect datetime value: 2007-04-31 for column d at row 1

– 示例③
ANSI 模式和传统模式的对比

MariaDB [test] set sql_mode= ANSI
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] drop table t;
Query OK, 0 rows affected (0.11 sec)

MariaDB [test] create table t(i int);
Query OK, 0 rows affected (0.45 sec)

MariaDB [test] insert into t values(9%0);
Query OK, 1 row affected (0.08 sec)

MariaDB [test] select * from t;
+——+
| i    |
+——+
| NULL |
+——+
1 row in set (0.00 sec)

MariaDB [test] set session sql_mode= TRADITIONAL
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] insert into t values(9%0);
ERROR 1365 (22012): Division by 0

– 示例④
使反斜线称为普通字符

MariaDB [test] set sql_mode= ansi
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] select @@global.sql_mode;
+——————————————–+
| @@global.sql_mode                          |
+——————————————–+
| NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+——————————————–+
1 row in set (0.00 sec)

MariaDB [test] select @@session.sql_mode;
+————————————————————-+
| @@session.sql_mode                                          |
+————————————————————-+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+————————————————————-+
1 row in set (0.00 sec)

MariaDB [test] select @@sql_mode;
+————————————————————-+
| @@sql_mode                                                  |
+————————————————————-+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+————————————————————-+
1 row in set (0.00 sec)

MariaDB [test] drop table t;
Query OK, 0 rows affected (0.14 sec)

MariaDB [test] create table t (context varchar(20));
Query OK, 0 rows affected (0.17 sec)

MariaDB [test] insert into t values(\beijing
Query OK, 1 row affected (0.07 sec)

MariaDB [test] select * from t;
+———+
| context |
+———+
|eijing |
+———+
1 row in set (0.00 sec)

MariaDB [test] insert into t values(\\beijing
Query OK, 1 row affected (0.11 sec)

MariaDB [test] select * from t;
+———-+
| context  |
+———-+
|eijing  |
| \beijing |
+———-+
2 rows in set (0.00 sec)

MariaDB [test] set sql_mode= REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI,NO_BACKSLASH_ESCAPES
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] insert into t values(\\beijing
Query OK, 1 row affected (0.00 sec)

MariaDB [test] select * from t;
+———–+
| context   |
+———–+
|eijing   |
| \beijing  |
| \\beijing |
+———–+
3 rows in set (0.00 sec)

– 示例⑤
ANSI 模式包含了 PIPES_AS_CONCAT 模式,会将 || 视为连接操作符

MariaDB [test] set sql_mode= ansi
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] select @@session.sql_mode;
+————————————————————-+
| @@session.sql_mode                                          |
+————————————————————-+
| REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI |
+————————————————————-+
1 row in set (0.00 sec)

MariaDB [test] select beijing || 2008
+——————-+
| beijing || 2008 |
+——————-+
| beijing2008       |
+——————-+
1 row in set (0.00 sec)

MariaDB [test] set sql_mode= NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] select beijing || 2008
+——————-+
| beijing || 2008 |
+——————-+
|                 1 |
+——————-+
1 row in set, 2 warnings (0.02 sec)

MariaDB [test] show warnings;
+———+——+———————————————-+
| Level   | Code | Message                                      |
+———+——+———————————————-+
| Warning | 1292 | Truncated incorrect INTEGER value: beijing |
| Warning | 1292 | Truncated incorrect DOUBLE value: beijing  |
+———+——+———————————————-+
2 rows in set (0.00 sec)

– 示例⑥
在将 MySQL 数据库迁移到其他数据时,可以设置 sql_mode 为 NO_TABLE_OPTIONS 模式,这样可以去掉 engine 关键字

MariaDB [test] show create table t;
+——-+———————————————————————————————-+
| Table | Create Table                                                                                 |
+——-+———————————————————————————————-+
| t     | CREATE TABLE `t` (
  `context` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+——-+———————————————————————————————-+
1 row in set (0.00 sec)

MariaDB [test] set session sql_mode= NO_TABLE_OPTIONS
Query OK, 0 rows affected (0.00 sec)

MariaDB [test] show create table t;
+——-+———————————————————–+
| Table | Create Table                                              |
+——-+———————————————————–+
| t     | CREATE TABLE `t` (
  `context` varchar(20) DEFAULT NULL
) |
+——-+———————————————————–+
1 row in set (0.00 sec)

感谢各位的阅读,以上就是“MySQL 的 SQL 模式介绍”的内容了,经过本文的学习后,相信大家对 MySQL 的 SQL 模式介绍这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是丸趣 TV,丸趣 TV 小编将为大家推送更多相关知识点的文章,欢迎关注!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计9601字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 韩国18福利视频免费观看 | 亚洲码在线中文在线观看 | 爱爱免费小视频 | 少妇高潮一区二区三区99 | 韩国资源视频一区二区三区 | 天天天天添天天拍天天谢 | 韩国美女福利视频 | 麻豆av福利av久久av | 久久综合给合综合久久 | 欧美xxxx色视频在线观看 | 亚洲高清视频在线 | 天天干天天摸 | 人妻美妇疯狂迎合 | 夜夜嗨av一区二区三区 | 成人欧美深夜福利视频在线播放 | 成人毛片国产a | 公么大龟弄得我好舒服秀婷视频 | 丰满熟女人妻一区二区三 | 亚洲av永久无码精品网站色欲 | 国产片91 | 一区二区不卡久久精品 | a级毛片免费观看网站 | 久久午夜羞羞影院免费观看 | 欧美成人中文字幕在线视频 | 91理论片午午伦夜理片久久 | 国产精品对白刺激久久久 | 一本大道无码av天堂 | www.草草草| 蜜桃视频一区二区在线观看 | 欧美高清在线视频一区二区 | 国产综合亚洲欧美日韩一区二区 | 毛片一级做a爰片性色 | 国产亚洲欧美日韩在线观看不卡 | 天堂av男人在线播放 | a毛片成人免费全部播放 | 中国国语毛片免费观看视频 | 色8激情欧美成人久久综合电影 | 国产性色视频 | 久久99国产精品久久 | 美女洗澡一级毛片 | 国产午夜高清一区二区不卡 |