数字文字 0 等于 VARCHAR 列中的任何内容
numeric literal 0 equals any content in a VARCHAR column
在 MySQL 中,VARCHAR 字段匹配数字文字 0 但不匹配数字文字 1。这种行为的原因是什么?
在您的最后一个示例中,MySQL 将尝试将您的 VARCHAR
列 CAST
转换为数值。例如,当您尝试将非数字字符串转换为 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.
中找到更多详细信息
在 MySQL 中,VARCHAR 字段匹配数字文字 0 但不匹配数字文字 1。这种行为的原因是什么?
在您的最后一个示例中,MySQL 将尝试将您的 VARCHAR
列 CAST
转换为数值。例如,当您尝试将非数字字符串转换为 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.
中找到更多详细信息