我有一个带有 INT 类型 ID 字段的表。
我正在做一些数据验证并注意到
SELECT * from mytable where id=94
和
SELECT * from mytable where id='94'
完美运行,但如果我使用
SELECT * from mytable where id='94dssdfdfgsdfg2'
它给了我同样的结果!这怎么可能?
我有一个带有 INT 类型 ID 字段的表。
我正在做一些数据验证并注意到
SELECT * from mytable where id=94
和
SELECT * from mytable where id='94'
完美运行,但如果我使用
SELECT * from mytable where id='94dssdfdfgsdfg2'
它给了我同样的结果!这怎么可能?
如果 MySql 的 string to int 函数的内部实现在解析第一个非数字之后从字符串中删除所有字符,这是可能的。
您所见证的称为“隐式数据转换”。
隐式,与“显式”相反,意味着数据类型会在可能的情况下自动转换为正在比较的列的数据类型。在这种情况下,MYTABLE.id
是一个 INTeger 数据类型,因此如果将要比较的值用单引号括起来,MySQL 会将其转换为 INT(基于字符串的数据类型到 SQL)。
由于转换,从字符串中最左边的位置开始,数据在最后一个数字字符的末尾被截断。