服务商替换MySQL为MariaDB后,为何向SMALLINT插入文本会存入0?
为什么向SMALLINT字段插入'test'会得到0值?
这是MariaDB(以及早期MySQL版本)的隐式类型转换和默认SQL模式共同作用的结果,具体原因拆解如下:
字符串转数值的解析规则:当你尝试向数值类型(比如SMALLINT)字段插入非数值字符串时,MariaDB会自动触发隐式类型转换。解析逻辑是从字符串开头读取连续的数字字符,直到遇到第一个非数字字符为止;如果字符串完全不包含有效数字(像'test'这样的纯字母字符串),转换结果就会是
0。默认SQL模式的容错机制:你的MariaDB版本是5.5.58,默认的
sql_mode没有启用严格模式(STRICT_TRANS_TABLES或STRICT_ALL_TABLES)。在非严格模式下,服务器遇到类型转换失败的情况时,不会直接抛出错误终止插入,而是会用转换后的默认值(这里是0)完成插入操作,同时生成一条警告。你可以在执行插入语句后运行SHOW WARNINGS;查看这条警告,通常会显示类似:Warning | 1366 | Incorrect integer value: 'test' for column 'Year' at row 1与存储引擎无关:不管使用Aria还是MyISAM存储引擎,这个行为都是一致的。因为类型转换是MariaDB服务器核心层处理的逻辑,和底层存储引擎的实现没有直接关联。
如果希望这类非法插入直接报错而不是插入默认值,你可以修改sql_mode启用严格模式,比如执行:
-- 针对当前会话生效 SET SESSION sql_mode = 'STRICT_ALL_TABLES'; -- 全局生效(需重启服务器完全生效) SET GLOBAL sql_mode = 'STRICT_ALL_TABLES';
内容的提问来源于stack exchange,提问作者Steven Neuberger
相关产品推荐
相关产品推荐

