gpt4 book ai didi

mysql - 将字符串与一个之前有空格而另一个没有空格的字符串进行比较

转载 作者:行者123 更新时间:2023-11-29 21:46:49 25 4
gpt4 key购买 nike

如果我必须找到一个字符串名称“Akito”并且它位于表foo中,那么以下是正常过程,

select * from foo where `name = 'Akito'`

我尝试检查它的两个变体,

工作正常

select * from foo where name = 'Akito   '

效果不佳

select * from foo where name = '    Akito'

谁能解释一下为什么第二个不起作用?

提前致谢

最佳答案

CHAR 类型将字符串填充到字段的长度使用空字节(而 VARCHAR 添加分隔符来指示字符串的结尾 - 从而忽略末尾的额外数据(我的意思是空字节)),因此末尾有空格的比较将忽略这些。前导空格是相关的,因为它们改变了字符串本身。请参阅克里斯托弗的回答。

编辑:需要进一步阐述

请参阅下面的一些实际测试。 VARCHAR 类型确实会向字符串添加空格,而 CHAR 字段即使用空格填充字符串直至其大小,也会在比较期间忽略它们。具体请参见带有 LENGTH 函数查询的第二行:

mysql> create table test (a VARCHAR(10), b CHAR(10));
Query OK, 0 rows affected (0.17 sec)

mysql> insert into test values ('a', 'a'), ('a ', 'a '), (' a', ' a');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select a, LENGTH(a), b, LENGTH(b) FROM test;
+------+-----------+------+-----------+
| a | LENGTH(a) | b | LENGTH(b) |
+------+-----------+------+-----------+
| a | 1 | a | 1 |
| a | 2 | a | 1 |
| a | 2 | a | 2 |
+------+-----------+------+-----------+
3 rows in set (0.00 sec)

其中 MySQL 声明 CHAR 字段,其插入时的值为“a”,长度只有 1 个字符。此外,如果我们连接一些数据:

mysql> select CONCAT(a, '.'), CONCAT(b, '.') FROM test;
+----------------+----------------+
| CONCAT(a, '.') | CONCAT(b, '.') |
+----------------+----------------+
| a. | a. |
| a . | a. |
| a. | a. |
+----------------+----------------+
3 rows in set (0.00 sec)

mysql> select CONCAT(a, b), CONCAT(b, a) FROM test;
+--------------+--------------+
| CONCAT(a, b) | CONCAT(b, a) |
+--------------+--------------+
| aa | aa |
| a a | aa |
| a a | a a |
+--------------+--------------+
3 rows in set (0.00 sec)

您可以看到,由于 VARCHAR 确实存储了字符串结束的位置,因此连接时仍保留空格 - 这对于 CHAR 类型并不成立。现在,请记住前面的 LENGTH 示例,其中第二行的字段 a 和 b 具有不同的长度,我们测试:

mysql> SELECT * FROM test WHERE a=b;
+------+------+
| a | b |
+------+------+
| a | a |
| a | a |
| a | a |
+------+------+
3 rows in set (0.00 sec)

因此,我们可以总结一下,CHAR 数据类型会忽略并修剪其字符串末尾的额外空格,而 VARCHAR 则不会 - 除了在比较期间:

mysql> select a from test where a = 'a ';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)

mysql> select a from test where a = 'a';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)

mysql> select a from test where a = ' a';
+------+
| a |
+------+
| a |
+------+
1 row in set (0.00 sec)

那么,CHAR类型也是如此吗?

mysql> select a from test where b = 'a ';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)

mysql> select a from test where b = 'a';
+------+
| a |
+------+
| a |
| a |
+------+
2 rows in set (0.00 sec)

mysql> select a from test where b = ' a';
+------+
| a |
+------+
| a |
+------+
1 row in set (0.00 sec)

这表明CHAR和VARCHAR类型具有不同的存储方法,但遵循相同的纯粹字符串比较规则。尾随空格被忽略;而前导空格则修改字符串本身。

关于mysql - 将字符串与一个之前有空格而另一个没有空格的字符串进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34042262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com