【问题标题】:Truncate on INSERT as an exception while in strict mode?在严格模式下将 INSERT 截断为异常?
【发布时间】: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 啊,我没有意识到这样的更改不会影响其他并发用户 - 这很好。如果你这样回答,我会接受的。

标签: mysql mariadb sql-mode


【解决方案1】:

有没有办法暂时覆盖sql_mode

是的,您可以通过在 INSERT 之前触发 SET sql_mode = 'mode'; 语句来更改此设置。

https://mariadb.com/kb/en/mariadb/sql-mode/#setting-sql_mode:

会话值只影响当前客户端,可以在需要时由客户端更改。

因此,如果您在之后立即将其重新设置,则可以确保它仅对这个特定的 INSERT 语句生效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 2016-08-15
    • 2014-05-01
    相关资源
    最近更新 更多