SQL模式变更引发的教训:SET GLOBAL sql_mode(ANSI_QUOTES)的影响

风和日丽的一天,报表没有数据了!

在一个风和日丽的日子,我的小伙伴突然跑过来找我,说我们的报表没有今天的数据了!这张表是通过代码进行数据处理,然后每天早上八点执行定时任务插入新表中的。可是今天为什么突然出问题了呢?

一、火速查看日志:

我迅速查看了日志,发现报错信息提示我实体类中的字段名出错了!奇怪,这张表一直执行都没有问题,为什么今天突然出问题呢?

于是,我请教了组内的两个小伙伴,看看究竟是什么情况。结果发现,原来是有人昨天改了数据库的语法规则。报错的原因在于:ANSI_QUOTES 改变了双引号 (") 的行为,使其被解释为标识符(如表名和列名),而不是字符串字面量。这使双引号的行为符合 ANSI SQL 标准。因此,我在 SQL 语句中的 CONCAT(count(iot.hearth_num),"") as 'number' 将字段转换为字符串就失效了,导致了报错 SQLSyntaxErrorException: Unknown column '' in 'field list'

小伙伴们,使用 SET GLOBAL sql_mode 时一定要慎重。因为执行这条语句,导致后续大量数据无法插入数据库,开发大佬解决了一上午!

二、SET GLOBAL sql_mode

        

SET GLOBAL sql_mode 命令用于配置 MySQL 的全局 SQL 模式,这些模式会影响 SQL 查询的行为。以下是命令中指定的每种模式的含义:

  • REAL_AS_FLOAT:此模式将 REAL 类型视为 FLOAT 的同义词。通常情况下,REAL 在 MySQL 中是 DOUBLE 的同义词。
  • PIPES_AS_CONCAT:此模式允许使用 || 作为字符串连接运算符(类似于 CONCAT() 函数),而不是逻辑或运算符。
  • ANSI_QUOTES:此模式改变双引号 (") 的行为,使其被解释为标识符(如表名和列名),而不是字符串字面量。这使双引号的行为符合 ANSI SQL 标准。
  • IGNORE_SPACE:此模式使解析器对函数名和左括号之间的空格更为宽容。例如,它允许 COUNT (column_name) 而不是 COUNT(column_name)

执行此命令后,指定的 SQL 模式将被设置为全局模式,影响所有会话。然而,请注意,改变全局 SQL 模式会影响连接到数据库的所有用户和应用程序,因此请确保这些更改不会对其他查询或操作产生负面影响。

三、总结

在使用 SET GLOBAL sql_mode 时,一定要充分了解每个模式的具体影响,尤其是在生产环境中,以避免意外的问题导致业务中断或数据异常。合理的测试和评估可以帮助我们避免类似的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值