当前位置: 首页 > 面试题库 >

比较字符串,其中一个字符串之前有空格,而另一个字符串之前没有空格

诸葛彦
2023-03-14
问题内容

如果我必须找到一个字符串名称"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字段的长度为1个字符,其插入时的值为’a’。此外,如果我们连接一些数据:

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类型具有不同的存储方法,但遵循相同的规则进行纯粹的字符串比较 。尾随空格将被忽略;而前导空格会修改字符串本身。



 类似资料:
  • 如何检查一个字符串是否在另一个字符串中,但匹配项需要在前面,而不是中间或最后。例如,a="

  • 问题内容: 我从书中看到以下代码: 但没有提到为什么“一个”大于“四个”。我试过了,它小于a和b。我想知道JavaScript如何比较这些字符串。 问题答案: 因为和许多编程语言一样,字符串是按字典顺序进行比较的。 你可以认为这是一个空想家版本的字母顺序,区别在于字母排序仅覆盖了26个字符通过。

  • 问题内容: 我是Java的新手,为了实践起见,我试图创建一个十六进制到十进制的数字转换器,因为我已经成功地制作了一个二进制到十进制的转换器。 我遇到的问题基本上是将一个字符串中的给定字符与另一个字符串进行比较。这就是我定义要比较的当前字符的方式: 这是我尝试比较角色的方法: 当我尝试通过仅输入数字(例如12)来运行代码时,它可以工作,但是当我尝试使用“ b”时,会出现一个奇怪的错误。这是运行程序的

  • 使用preg_replace(或其他基于 PHP 的选项):我需要用空格替换字符串中出现在最后一个连字符之前的所有连字符。 我需要的结果示例1: String=My-Cool-String-201 结果 = 我的酷字符串 - 201 示例#2我需要的结果: 注意:请注意,此字符串示例仅包含1个连字符。 字符串 = 我的酷字符串 - 201 结果 = 我的酷字符串 - 201 我当前的代码是删除所有

  • 问题内容: 我试图提取一个子字符串。我需要在PHP中做一些帮助。 以下是一些我正在使用的示例字符串以及需要的结果: 我想将字符串保留到第一个,但是如果不存在,请获取整个字符串。 我试过了, 我认为它说-获取位置,然后从位置0到 该 位置获取子字符串。 我不知道如何处理不存在的情况,而又不会使声明太大。 有没有一种方法也可以处理这种情况而又不会使PHP语句过于复杂? 问题答案: 采用 在这种情况下,

  • 问题内容: 空字符串()和空字符串()有什么区别? 这就是我所拥有的: 这是什么意思? 问题答案: 表示将空值分配给。在这种情况下,与相同,将按预期产生。 表示将()或“完全没有值”分配给。因此,这与相同,它将产生一个,因为您无法在Java中对变量(指针或类似物)调用方法。 还有一点,声明 实际上具有与以下功能相同的效果: 鉴于 如前所述,是另一回事。