一模一样`A< B` expression unexpectedly returns different results in different contexts in MySQL

问题描述 投票:0回答:1

今天我在 MySQL 中遇到了

<
运算符的极其违反直觉的行为,我不知道为什么。

<
指定完全相同的操作数会根据上下文给出不同的结果。

谁能解释一下原因吗?这太违反直觉了,我什至怀疑这是 MySQL 的一个错误。

SQL

DROP TABLE IF EXISTS t1;

CREATE TABLE
    t1 (s VARCHAR(10));

INSERT INTO
    t1 (s)
VALUES
    ('0001/a'),
    ('0001/b'),
    ('0002/a'),
    ('0002/b'),
    ('0003/a'),
    ('0003/b');

SELECT ('/' < ':'); -- => `TRUE`

SELECT ('0002/a' < '0002:'); -- => `TRUE`

SELECT ('0002/b' < '0002:'); -- => `TRUE`

SELECT * FROM t1 WHERE (s < '0002:'); -- => What will the result be?

预期结果

+--------+
| s      |
+--------+
| 0001/a |
| 0001/b |
| 0002/a |
| 0002/b |
+--------+

实际结果

+--------+
| s      |
+--------+
| 0001/a |
| 0001/b |
+--------+

环境

我使用的是容器版本的MySQL,没有特殊配置:

$ docker run -d -p 3306:3306 --name mysql \
  -e 'MYSQL_DATABASE=t' \
  -e 'MYSQL_ROOT_PASSWORD=password' \
  --restart always mysql
mysql
1个回答
0
投票

我认为您可能误读了 true 和 false 的返回值。成功的函数调用通常返回 0,但在逻辑运算符术语中,0 表示 false。我明白了

mysql> SELECT ('/' < ':');
+-------------+
| ('/' < ':') |
+-------------+
|           0 |
+-------------+
1 row in set (0.00 sec)
© www.soinside.com 2019 - 2024. All rights reserved.