从MariaDB 10.0.x升级到10.3.x后,包含引号的整数字符串(如“ 3”)的SELECT不再隐式转换为INTEGER列值,这将导致查询失败1366,不正确的整数值。有没有一种方法可以启用隐式转换?
已经尝试了一些SQL_MODE设置来解决该问题,但没有效果。这是一个简单的示例场景。
CREATE TABLE IF NOT EXISTS database.tablename (
col1 INTEGER UNSIGNED,
col2 INTEGER UNSIGNED,
PRIMARY KEY (col1)) ENGINE = MEMORY;
INSERT INTO database.tablename VALUES (1,'2');
查询失败(1366),:第1行的'database','tablename','col2'列的整数值不正确
我希望查询成功,因为在第二行中隐式将第2列强制转换为INTEGER UNSIGNED(在MariaDB 10.0.x中发生)。
答案 0 :(得分:0)
我已经知道发生了什么事。
启用STRICT_TRANS_TABLES模式会在表定义中暴露一个问题,其中没有为INTEGER列提供默认值。这是MariaDB 10.3中对我们的新问题,因为MariaDB 10.0.38和10.3.15之间的默认SQL_MODE更改包括STRICT_TRANS_TABLES。可以通过删除该标志来纠正。
通过与连接的进程一起运行的MariaDB删除标志
set sql_mode =“”; 设置GLOBAL sql_mode =“”;
在重新启动连接过程并将其与数据库的连接重置之前,不会更改INSERT行为。此后,将应用数据类型默认值规则,并且执行INSERT查询时不会出错。
因此问题不在于查询中引用的整数数据类型,而是当为连接启用STRICT_TRANS_TABLES时,该列没有整数默认值。
答案 1 :(得分:0)
如果您需要快速解决方案,您可以在查询前添加 set sql_mode = "";。例如 -
set sql_mode = "";
your sql here;