MySQL/MariaDB中SELECT 0 = 'N;'返回true的原因咨询
为什么0会与PHP序列化的null值'N;'匹配?
这是MySQL/MariaDB的隐式类型转换导致的结果,核心规则是:当数字与字符串进行相等比较时,数据库会自动将字符串尝试转换为数字类型后再做比较。
具体转换逻辑:
- 从字符串的起始位置读取连续的数字字符(包括正负号、小数点),直到遇到非数字字符为止;
- 如果字符串开头就不是有效数字,转换后的结果为0。
对应你的测试场景:
SELECT 0 = 'N;':字符串'N;'的第一个字符是非数字,转换为数字0,0和0相等,所以返回1;SELECT 1 = 'N;':'N;'转换为0,1和0不相等,返回0;- 至于
0 = null返回null、'N;' is null返回0,是因为null的比较规则特殊:任何值和null用=比较都返回null,is null是严格判断值是否为null,'N;'显然不是null,所以返回0,这部分和隐式类型转换无关。
如果要避免这种错误匹配,需要强制类型一致后再比较,比如:
- 将数字字段转为字符串:
SELECT CAST(0 AS CHAR) = 'N;',返回0; - 用
BINARY关键字强制按二进制字符串比较:SELECT 0 = BINARY 'N;',返回0。
内容的提问来源于stack exchange,提问作者frumbert
相关产品推荐
相关产品推荐

