字符串真实性在MySQL中是如何工作的?

字符串真实性在MySQL中是如何工作的?,mysql,casting,Mysql,Casting,我想查找某个字符串字段不为空的记录,所以我只写了SELECT。。。从myTable WHERE x,假设空字符串和空字符串的计算结果为false,但情况似乎并非如此 字符串“02306”是真的,而“N06097EIP”在某种程度上是假的 发生什么事了 编辑:我知道解决方法,我只是想知道铸造是如何工作的。不要试图通过语法快捷方式来表现得太可爱。如果没有别的,下一个开发人员总是很难弄清楚你在做什么 把你想要的说清楚就行了 SELECT * FROM myTable WHERE x I

我想查找某个字符串字段不为空的记录,所以我只写了
SELECT。。。从myTable WHERE x
,假设空字符串和空字符串的计算结果为false,但情况似乎并非如此

字符串“02306”是真的,而“N06097EIP”在某种程度上是假的

发生什么事了


编辑:我知道解决方法,我只是想知道铸造是如何工作的。

不要试图通过语法快捷方式来表现得太可爱。如果没有别的,下一个开发人员总是很难弄清楚你在做什么

把你想要的说清楚就行了

SELECT *
    FROM myTable
    WHERE x IS NOT NULL AND x <> '';
选择*
从myTable
其中x不为NULL且x为“”;
或者,如果您愿意:

SELECT *
    FROM myTable
    WHERE COALESCE(x, '') <> '';
选择*
从myTable
其中聚结(x,,)'';

在这些表达式中,字符串首先转换为数字。“02306”被转换为2306,该值大于0,因此被视为
true
,而“N06097EIP”(以非数字开头)被转换为0,评估为
false

比较以下各项的结果:

select convert("N06097EIP",signed)


在布尔上下文中,例如

WHERE x
表达式
x
将作为整数值计算。请注意,MySQL将布尔值视为数字类型

表达式
x
是什么类型并不重要;它要么是整数类型,要么将根据记录的转换规则转换为整数类型

最终结果是表达式
x
将被计算为NULL、整数零或整数非零

这些对应于布尔“真实性”值NULL、FALSE和TRUE

之所以认为“02306”为真,是因为该字符串转换为非零的整数值2306

'N06097EIP'
被认为是错误的原因是该字符串转换为整数值0

要运行简单的测试用例进行验证,请执行以下操作:

SELECT IF( 0 = 'N06097EIP', 'is zero', 'is not zero')
SELECT 0 = 'N06097EIP'

你观察到的行为完全是意料之中的。一切都很简单。您可能会措手不及,因为规范模式是让我们避免这种类型的评估,而是使用“变通方法”(如您所说)返回布尔值。

您能更好地解释一下吗?你试过什么?有什么例子吗?为什么不使用“is null”?或者像ifnull(myfield,“)=”@jcho360:Huh?我举了两个例子。我想知道为什么前一个字符串被认为是真的,后一个字符串被认为是假的。这在我的代码中不是问题。@heximal:ifnull是否也检查空字符串?否,但您可以使用ifnull将空值转换为空字符串,然后将其与空字符串文字进行比较。是的,这就是我最后要做的,但我仍然需要一个解释。匿名投票人愿意解释他们的反对意见吗?“不是我。你的答案不是我想要的,但我向你提供了信息。即使类型是
varchar(25)
,它也会先尝试将其转换为整数?我觉得这有点奇怪。欢迎来到MySQL我想它甚至不应该允许像您使用的那种类似C的伪布尔表达式。:]@马克:不管表达式
x
的类型是什么。。。重要的是MySQL在布尔上下文中解释它,这意味着无论
x
是什么类型,它都将被转换为整数值并进行计算。。。它要么为NULL,要么为0,要么不为零,这相当于布尔值“truthiness”值
NULL
FALSE
TRUE
(分别是)嗯,我最近经常用PHP编码,PHP的真值表有点不同,所以。。我想我只是希望它能以同样的方式工作。一旦您知道MySQL试图将所有内容转换为整数,这种行为是有意义的。谢谢
SELECT IF( 0 = 'N06097EIP', 'is zero', 'is not zero')
SELECT 0 = 'N06097EIP'