where子句中的MySQL错误?
我有一个有印刷错误的查询:where子句中的MySQL错误?,mysql,sql,Mysql,Sql,我有一个有印刷错误的查询: SELECT SUM(qty) AS 'aqty1' FROM po_details WHERE product_id ='1196' AND so_number = '1m'; 应该是: SELECT SUM(qty) AS 'aqty1' FROM po_details WHERE product_id ='1196' AND s
SELECT
SUM(qty)
AS
'aqty1'
FROM
po_details
WHERE
product_id ='1196'
AND
so_number = '1m';
应该是:
SELECT
SUM(qty)
AS
'aqty1'
FROM
po_details
WHERE
product_id ='1196'
AND
so_number = '1';
但是第一个错误的查询有so_number='1m'
神秘地正确输出,与第二个正确查询的输出相同,这不应该是正确的,对吗
product\u id
和so\u number
的数据类型都是INT
<如果so\u number
的数据类型是VARCHAR
,那么code>so\u number='1m'应该可以工作,因为我已经将1m
括在引号中,条件集是so\u number,比如'%1m%
那么,为什么上面的输入错误查询是有效的呢?MySQL错误不应该说它找不到<代码> 1M < /代码>,并将其视为<代码> 1 <代码>?这是已知的bug吗?我使用的是MySQL 5.6.14
以下是一个屏幕截图:
这是由MySQL执行的隐式转换。您可以阅读以下内容: 当运算符与不同类型的操作数一起使用时,键入 发生转换以使操作数兼容。一些转换 含蓄地发生 e、 g:
它是隐式转换,由MySQL执行。您可以阅读以下内容: 当运算符与不同类型的操作数一起使用时,键入 发生转换以使操作数兼容。一些转换 含蓄地发生 e、 g:
要比较MySQL,必须将
'1m'
转换为整数。它能做的最好的事情就是1
。啊,这样它就不会读取字符m
,即使我把它们括在引号里了?引号是字符串的符号,它们不是用来分组的,就像在线搜索一样。如果MySQL将字符串'1m'
转换为整数(为了比较它必须这样做),那么当它找到非数字的'm'
时,它会停止,因此它只找到整数1
。要比较MySQL,必须将'1m'
转换为整数。它能做的最好的事情就是1
。啊,这样它就不会读取字符m
,即使我把它们括在引号里了?引号是字符串的符号,它们不是用来分组的,就像在线搜索一样。如果MySQL将字符串'1m'
转换为整数,它必须这样做才能进行比较,当它找到非数字的'm'
时,它就会停止,因此它只找到整数1
。这就是我要找的解释。谢谢隐式转换是可以的,但是像'2m'这样的字符串的“部分转换”可能会导致意外的结果——在这种情况下,oracle DB会抛出一个错误。至少MySQL中有一个意外的行为,这就是我要寻找的解释。谢谢隐式转换是可以的,但是像'2m'这样的字符串的“部分转换”可能会导致意外的结果——在这种情况下,oracle DB会抛出一个错误。至少在MySQL中有一个意外的行为,IMHO。。。
mysql> SELECT 1+'1';
-> 2
mysql> SELECT CONCAT(2,' test');
-> '2 test'