为什么不启用 innodb 严格模式?

spr*_*aff 5 mysql

我尝试在/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)中添加这一行

innodb_strict_mode = 1
Run Code Online (Sandbox Code Playgroud)

这是在 [mysqld] 部分中,我在其他示例中看到了这一行。我知道这个配置文件正在启动时被读取,因为如果我输入无意义的内容,我会得到错误。

尽管如此, SHOW VARIABLES 将该变量列为 OFF 并且显然我可以在不指定非默认字段的情况下插入行。

为什么没有设置这个变量?

我试过=on代替=1,没有区别。否则,配置未从安装默认值 AFAIK 中修改,全文请点击此处

Vér*_*ace 7

您可以SESSION从命令行设置此变量:

mysql> show variables like '%strict%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_strict_mode | OFF   |
+--------------------+-------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

然后,你这样做:

mysql> set innodb_strict_mode = ON;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

然后,检查:

mysql> show variables like '%strict%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_strict_mode | ON    |
+--------------------+-------+
Run Code Online (Sandbox Code Playgroud)

然后,在退出和重新连接并重新检查变量时,它再次关闭 - 默认值。SET GLOBAL innodb_strict_mode = ON如果您不希望它在注销后重置,请使用。但是,在客户端中设置它不会在服务器重新启动后使更改保持不变。

编辑my.cnf- 我从未见过或接触过mysqld.cnf.

将下面的行放在 my.cnf 的 [mysqld] 部分。

sql_mode    = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY"
innodb_strict_mode = ON
Run Code Online (Sandbox Code Playgroud)

(我也推荐 sql_mode 行 - 否则,例如,某些GROUP BY查询将返回(咳咳...)异常结果)。

退回服务器 - 并重新登录。

mysql> show variables like '%strict%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_strict_mode | ON    |
+--------------------+-------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

这一切都在此处的文档中。

您可以在启动 mysqld 时在命令行上或在配置文件 my.cnf 或 my.ini 中打开或关闭 innodb_strict_mode。您还可以在运行时使用语句 SET [GLOBAL|SESSION] innodb_strict_mode=mode 启用或禁用 innodb_strict_mode,其中 mode 为 ON 或 OFF。更改 GLOBAL 设置需要 SUPER 权限并影响随后连接的所有客户端的操作。任何客户端都可以更改 innodb_strict_mode 的 SESSION 设置,并且该设置仅影响该客户端。

也许你没有SUPER特权?登录并运行SHOW GRANTS以找出答案。