今天,我在SQL中遇到了<
操作员的一种极其违反直觉的行为,我不知道为什么.
为<
插入完全相同的操作数会根据上下文给出不同的结果.
有人能解释一下原因吗?这是如此违反直觉,我甚至怀疑这是SQL的一个错误.
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 |
+--------+
环境
我使用的是没有特殊配置的容器版本:
$ docker run -d -p 3306:3306 --name mysql \
-e 'MYSQL_DATABASE=t' \
-e 'MYSQL_ROOT_PASSWORD=password' \
--restart always mysql
编辑 1
我可以用DB Fiddle来重现这种行为:
编辑 2
> show variables like "%collat%"
+-------------------------------+--------------------+
| Variable_name | Value |
+-------------------------------+--------------------+
| collation_connection | utf8mb3_general_ci |
| collation_database | utf8mb4_0900_ai_ci |
| collation_server | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+