You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

服务商替换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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:28:20