gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:55:57 27 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/7455147/

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