【发布时间】:2017-07-20 10:38:50
【问题描述】:
我正在使用 MariaDB 10.2.4。默认情况下,sql_mode 包括 STRICT_TRANS_TABLES,这在大多数情况下都很好。但在特定情况下,我希望数据被截断。有没有办法临时覆盖 sql_mode,或者 INSERT 语句的选项显式允许截断?我在文档或谷歌搜索中找不到任何内容。
您可能会认为这是 Should I disable MySQL strict mode? 的副本,但这个问题是在 2011 年提出的,因此从那时起可能会有新的选择。另外,这个问题是关于一般模式的最佳实践,而不是关于在运行时覆盖的能力。
【问题讨论】:
-
如果您在这里谈论简单的文本字段/值,您也许可以尝试在您的语句中进行“截断”?我在想
INSERT INTO ... VALUES(SUBSTRING('long dynamic text value here', 1, 10))之类的东西……当然这不是很灵活,如果表结构发生变化,就需要修改;但作为应用程序中单个事件的解决方法,它可能会这样做。 -
是的,我知道,或者我可以在生成语句时在 PHP 中执行此操作,但无论哪种方式,我都希望不必记住保持架构和代码与硬编码同步数字。这当然是我的 B 计划,但还有其他选择吗?
-
好吧,我想你总是可以通过在 INSERT 之前触发
SET sql_mode = 'mode';语句从代码中设置它,然后在之后立即设置它,mariadb.com/kb/en/mariadb/sql-mode/#setting-sql_mode - “会话值只影响当前客户端,并且可以在需要时由客户端更改” -
@CBroe 啊,我没有意识到这样的更改不会影响其他并发用户 - 这很好。如果你这样回答,我会接受的。