风和日丽的一天,报表没有数据了!
在一个风和日丽的日子,我的小伙伴突然跑过来找我,说我们的报表没有今天的数据了!这张表是通过代码进行数据处理,然后每天早上八点执行定时任务插入新表中的。可是今天为什么突然出问题了呢?
一、火速查看日志:
我迅速查看了日志,发现报错信息提示我实体类中的字段名出错了!奇怪,这张表一直执行都没有问题,为什么今天突然出问题呢?
于是,我请教了组内的两个小伙伴,看看究竟是什么情况。结果发现,原来是有人昨天改了数据库的语法规则。报错的原因在于: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
时,一定要充分了解每个模式的具体影响,尤其是在生产环境中,以避免意外的问题导致业务中断或数据异常。合理的测试和评估可以帮助我们避免类似的问题。