urs*_*ion 3 mysql rdbms mysql-5.1
如果在应用程序中,如果我们在我的应用程序中执行 sql_mode=mysql4.0 作为第一个查询,但在我的应用程序中使用 MySQL 5.1 那么会发生什么?
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)
看看那些模式。有人说
基于您之前使用过的任何 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 的结果集可能会发生根本性的变化,因此请格外小心地使用它。
我希望这回答了你的问题 !!!