数字文字 0 等于 VARCHAR 列中的任何内容

numeric literal 0 equals any content in a VARCHAR column

在 MySQL 中,VARCHAR 字段匹配数字文字 0 但不匹配数字文字 1。这种行为的原因是什么?

在您的最后一个示例中,MySQL 将尝试将您的 VARCHARCAST 转换为数值。例如,当您尝试将非数字字符串转换为 DECIMAL 时,转换将在第一个非数字字符处停止。空字符串将匹配 0

例如:

> select cast('x123' as decimal);
+-------------------------+
| cast('x123' as decimal) |
+-------------------------+
|                       0 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)

> show warnings;
+---------+------+-------------------------------------------+
| Level   | Code | Message                                   |
+---------+------+-------------------------------------------+
| Warning | 1292 | Truncated incorrect DECIMAL value: 'x123' |
+---------+------+-------------------------------------------+

另一方面,如果您有前导数字字符,这些字符将被转换为十进制:

> select cast('123x' as decimal);
+-------------------------+
| cast('123x' as decimal) |
+-------------------------+
|                     123 |
+-------------------------+
1 row in set (0.00 sec)

在这种情况下,非数字尾随字符将被忽略。转换为 INTEGER 将以类似的方式发生,并产生相同的结果。可以从 manual.

中找到更多详细信息