今天我在 MySQL 中遇到了
<
运算符的极其违反直觉的行为,我不知道为什么。
为
<
指定完全相同的操作数会根据上下文给出不同的结果。
谁能解释一下原因吗?这太违反直觉了,我什至怀疑这是 MySQL 的一个错误。
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
我认为您可能误读了 true 和 false 的返回值。成功的函数调用通常返回 0,但在逻辑运算符术语中,0 表示 false。我明白了
mysql> SELECT ('/' < ':');
+-------------+
| ('/' < ':') |
+-------------+
| 0 |
+-------------+
1 row in set (0.00 sec)