MySQL:什么是 SQL 模式以及我们为什么使用它

urs*_*ion 3 mysql rdbms mysql-5.1

如果在应用程序中,如果我们在我的应用程序中执行 sql_mode=mysql4.0 作为第一个查询,但在我的应用程序中使用 MySQL 5.1 那么会发生什么?

  • 我的系统会使用 MySQL 4.0 或 MySQL 5.1 版本功能吗?什么是
  • RDBMS 中的 SQL 模式?我们为什么要使用这个?
  • 在什么基础上,我们应该设置它的值?

Rol*_*DBA 7

MySQL 的sql_mode设置允许您强制或放宽 SQL 处理的 ANSI 标准。

在您的情况下,MySQL 将在行为和结果方面退步。凭什么 ?MySQL 5.1 版本功能将保留,但 SQL 处理方式发生变化。这是证明:

MySQL 5.0 首先将存储过程引入 MySQL 领域。

MySQL 4.x 从来没有存储过程。

现在,让我们来看看 MySQL 5.x Stored Procedures 的物理家,mysql.proc

+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+-----------------------------+
| Field                | Type                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | Null | Key | Default             | Extra                       |
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+-----------------------------+
| db                   | char(64)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | NO   | PRI |                     |                             |
| name                 | char(64)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | NO   | PRI |                     |                             |
| type                 | enum('FUNCTION','PROCEDURE')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | NO   | PRI | NULL                |                             |
| specific_name        | char(64)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | NO   |     |                     |                             |
| language             | enum('SQL')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         | NO   |     | SQL                 |                             |
| sql_data_access      | enum('CONTAINS_SQL','NO_SQL','READS_SQL_DATA','MODIFIES_SQL_DATA')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  | NO   |     | CONTAINS_SQL        |                             |
| is_deterministic     | enum('YES','NO')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | NO   |     | NO                  |                             |
| security_type        | enum('INVOKER','DEFINER')                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | NO   |     | DEFINER             |                             |
| param_list           | blob                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | NO   |     | NULL                |                             |
| returns              | longblob                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | NO   |     | NULL                |                             |
| body                 | longblob                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | NO   |     | NULL                |                             |
| definer              | char(77)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | NO   |     |                     |                             |
| created              | timestamp                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | NO   |     | CURRENT_TIMESTAMP   | on update CURRENT_TIMESTAMP |
| modified             | timestamp                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | NO   |     | 0000-00-00 00:00:00 |                             |
| sql_mode             | set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH') | NO   |     |                     |                             |
| comment              | char(64)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | NO   |     |                     |                             |
| character_set_client | char(32)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | YES  |     | NULL                |                             |
| collation_connection | char(32)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | YES  |     | NULL                |                             |
| db_collation         | char(32)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | YES  |     | NULL                |                             |
| body_utf8            | longblob                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | YES  |     | NULL                |                             |
+----------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------+-----+---------------------+-----------------------------+
20 rows in set (0.02 sec)
Run Code Online (Sandbox Code Playgroud)

请注意第 15 栏: sql_mode

sql_mode
set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','NOT_USED',
'ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL',
'ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS',
'MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES',
'STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE',
'INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER',
'HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH')
Run Code Online (Sandbox Code Playgroud)

看看那些模式。有人说

  • 'POSTGRESQL'
  • '甲骨文'
  • 'MSSQL'
  • 'DB2'
  • 'MAXDB'
  • 'MYSQL323'
  • 'MYSQL40'

基于您之前使用过的任何 RDBMS,您可以让存储过程中的 SQL 启动并做您喜欢的任何歌曲和舞蹈(换句话说,您可以根据您的意愿使 SQL 的执行变得严格或宽松在您选择的协议上)。

这将允许您将在 MySQL 4.x 中编写的任何代码移植到 MySQL 5.x 存储过程中,并期望结果的顺序与在 MySQL 4.x 中运行的顺序相同。

我曾经写过一篇关于依赖未记录的 MySQL 行为的帖子的答案(当依赖未记录的行为来确定 MySQL 为 GROUP BY 操作中的隐藏列选择的值时,存在哪些极端情况?)。在那篇文章中,我写了一条评论说:

存在本地 GROUP BY 现象并且有一个专门用于它的 URL( dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html )的事实表明,极端情况应该是没有惊喜。请注意这个 GROUP BY 怪癖如何方便地称为 MySQL 扩展。想象一下,如果 Oracle 现在采用 MySQL 并修复了那个 GROUP BY 怪癖。想象一下,如果 SQL_MODE 默认为 GROUP BY 的严格模式:http ://dev.mysql.com/doc/refman/5.5/en/server-sql-mode.html#sqlmode_only_full_group_by 极端情况的可能性可以去关于... – RolandoMySQLDBA 2012 年 11 月 26 日 21:47

这让您有时间思考如何正确规划 SQL 代码从 MySQL 3.x、MySQL 4.x 或其他 RDBMS 产品到 MySQL 5.x 的迁移。它还警告您,如果您篡改sql_mode,来自 SQL 的结果集可能会发生根本性的变化,因此请格外小心地使用它。

我希望这回答了你的问题 !!!