我支持传统的PHP系统。他们正在计划移动数据库服务器。我们目前在MariaDB 10.1上,新服务器也是MariaDB 10.1。我有数百(或几千)个查询,如下所示:
UPDATE ontime_assets
SET AssetName = '117 J19', PlateDate = '20161224', InspectionDate = ''
WHERE AssetID = 7;
在当前数据库上,这个处理得很好。在新的一个我得到这个错误:
更新记录时出错:日期时间值不正确:列为'' 第1行的'InspectionDate'。
他们告诉我数据库已迁移且结构相同,但显然不是。 InspectionDate
是一个不需要的DATETIME,设置为接受NULL值。
良好的代码与否,代码重写取出空字符串是不可行的。有没有人知道MariaDB设置它是什么,这将允许此查询当前工作,但将在新服务器上设置不同?
答案 0 :(得分:3)
好的,我整晚都在睡觉,但我明白了!
在etc / my.cnf文件中配置了一个名为SQL_MODE的设置,并且如果数据库是从usr / my.cnf文件中的先前版本升级的(这对于等文件来说太过挫折,但是我找到了!)。
您可以通过运行查询找到您的sql_mode设置:SELECT @@ sql_mode;
OLD数据库没有设置STRICT_TRANS_TABLES,新数据库确实如此,因此新字符串上的空字符串日期错误,但不是旧字符串。我从usr和etc my.cnf文件中取出了STRICT_TRANS_TABLES并让它们回收了mysql服务器进程,然后看到代码就像在旧盒子上一样工作!
答案 1 :(得分:0)
有没有人知道MariaDB设置它是什么允许此查询当前工作但在新服务器上设置不同?
没有。如果InspectionDate
列为datetime
,则不允许分配空字符串。最有可能的是,查询之前已在运行,因为InspectionDate
是一个文本列。这是没有吸引力的,因为那样你就无法利用数据库所具有的日期功能。
只需将NULL
作为占位符分配给InspectionDate
列,而不是分配空字符串:
UPDATE ontime_assets
SET AssetName = '117 J19',
PlateDate = '20161224',
InspectionDate = NULL
WHERE AssetID = 7
如果您需要帮助更新脚本,也许这里有人可以为您提供正则表达式,以InspectionDate = ''
选择性地替换InspectionDate = NULL
。