如何在MySQL中启用严格?
让我从严格的SQL中获取数据并处理相同的内容。
我当前的slq_mode
mysql> SELECT @@sql_mode;
+------------------------+
| @@sql_mode |
+------------------------+
| NO_ENGINE_SUBSTITUTION |
+------------------------+
答案 0 :(得分:5)
执行以下操作:
SET GLOBAL sql_mode='STRICT_TRANS_TABLES';
答案 1 :(得分:2)
使用SQL命令或更改配置文件,基本上有两种方法。如果使用SQL命令设置它 - 它将在服务器重新启动后更改回来。
在SQL中执行:
SET GLOBAL sql_mode='STRICT_TRANS_TABLES';
在配置文件中执行:
[mysqld]
sql_mode="STRICT_TRANS_TABLES"
文件位置因操作系统而异,具体取决于在何处找到它:https://dev.mysql.com/doc/refman/5.7/en/option-files.html
需要注意的是,您可以指定多种模式:
sql_mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"
这在使用SQL语句时尤为重要,因为它可以覆盖整个模式字符串。
有关SQL模式的更多内容:https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
答案 2 :(得分:0)
其他答案是正确的,但它们不适用于AWS RDS。
如果您在AWS RDS上运行MySQL服务器,则无法直接运行SET GLOBAL sql_mode='STRICT_TRANS_TABLES';
,因为即使拥有管理员级别的凭证,您也没有必需的权限:
mysql> SET GLOBAL sql_mode='STRICT_ALL_TABLES';
ERROR 1227 (42000): Access denied; you need (at least one of) the SUPER or SYSTEM_VARIABLES_ADMIN privilege(s) for this operation
在AWS RDS中,由于它是托管数据库服务,因此您无权直接访问my.cnf
或其他配置文件-因此您也无法在其中更改设置。
但是,请注意,您可以在会话级别设置sql_mode
,但是在会话更改或重新启动时,该设置将丢失:
mysql> SET SESSION sql_mode='STRICT_ALL_TABLES';
Query OK, 0 rows affected, 1 warning (0.30 sec)
mysql> SELECT @@session.sql_mode;
+---------------------+
| @@session.sql_mode |
+---------------------+
| STRICT_ALL_TABLES |
+---------------------+
1 row in set (0.31 sec)
那么您如何在GLOBAL级别更改sql_mode
(或与此相关的任何其他参数),以使它们在AWS RDS MySQL的重新启动过程中持续存在?
您需要在RDS中创建自定义数据库Parameter Group
(例如,使用Web控制台),如下所示:
然后,您必须modify
的RDS实例并像下面这样应用新创建的参数组:
最后,应用您的修改,然后重新启动实例(是的,需要重新启动)。
瞧,您已经根据需要设置了sql_mode
,并且它在重启后仍然有效:
mysql> SELECT @@sql_mode;
+------------------------------------------+
| @@sql_mode |
+------------------------------------------+
| STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION |
+------------------------------------------+
1 row in set (0.69 sec)
mysql> SELECT @@global.sql_mode;
+------------------------------------------+
| @@global.sql_mode |
+------------------------------------------+
| STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION |
+------------------------------------------+
1 row in set (0.62 sec)
mysql> SELECT @@session.sql_mode;
+------------------------------------------+
| @@session.sql_mode |
+------------------------------------------+
| STRICT_ALL_TABLES,NO_ENGINE_SUBSTITUTION |
+------------------------------------------+
1 row in set (0.38 sec)