为什么比较 MYSQL 中的类型不会引发错误?
Why does comparing types in MYSQL not raise an error?
这个:
SELECT * FROM table WHERE comlumn1 = column2;
returns 结果。
这个:
SELECT * FROM table WHERE column1 != column2;
return什么也没做,即使列中的单元格满足这两个请求。
原来column1是varchar
,column2是int
。
我的问题是为什么没有报错?为什么一个 return 结果而不是另一个?如果类型不同,它们肯定总是不相等的?
更新:
column1
中的值 varchars
类似于 1234-34
,column2
中的值 ints
类似于 1234
。这意味着它将始终匹配,因为它将 varchar
1234-34
变成 1234
.
当您在 MySQL 中比较字符串和整数时,MySQL 会将字符串转换为整数。具体规则详见documentation。在您的情况下,这些将作为浮点数进行比较。
将整数转换为浮点数很容易。转换字符串使用隐式转换——转换字符串中遇到的第一个数字。如果有 none,则值为零。所以,'12.3abc'
变成了 12.3
; 'abc'
变为 0
.
这可能就是比较失败的原因。但是,我希望 =
失败,但 <>
成功。
将字符串与数字进行比较时,MySQL 会尝试将字符串转换为数字以进行比较。
如果不可能,则字符串的数字结果为 0
。
示例:
string value | int value | comparison result
'abc' | 1 | 0 = 1 -> false
'1' | 1 | 1 = 1 -> true
'1abc' | 1 | 1 = 1 -> true
'abc1' | 1 | 0 = 1 -> false
这个:
SELECT * FROM table WHERE comlumn1 = column2;
returns 结果。
这个:
SELECT * FROM table WHERE column1 != column2;
return什么也没做,即使列中的单元格满足这两个请求。
原来column1是varchar
,column2是int
。
我的问题是为什么没有报错?为什么一个 return 结果而不是另一个?如果类型不同,它们肯定总是不相等的?
更新:
column1
中的值 varchars
类似于 1234-34
,column2
中的值 ints
类似于 1234
。这意味着它将始终匹配,因为它将 varchar
1234-34
变成 1234
.
当您在 MySQL 中比较字符串和整数时,MySQL 会将字符串转换为整数。具体规则详见documentation。在您的情况下,这些将作为浮点数进行比较。
将整数转换为浮点数很容易。转换字符串使用隐式转换——转换字符串中遇到的第一个数字。如果有 none,则值为零。所以,'12.3abc'
变成了 12.3
; 'abc'
变为 0
.
这可能就是比较失败的原因。但是,我希望 =
失败,但 <>
成功。
将字符串与数字进行比较时,MySQL 会尝试将字符串转换为数字以进行比较。
如果不可能,则字符串的数字结果为 0
。
示例:
string value | int value | comparison result
'abc' | 1 | 0 = 1 -> false
'1' | 1 | 1 = 1 -> true
'1abc' | 1 | 1 = 1 -> true
'abc1' | 1 | 0 = 1 -> false