MySQL对包含空格的值的搜索返回空结果(没有行)


MySQL search for value containing spaces returns empty result (no rows)

我有一个MySQL数据库,其中一列包含零件号。部分零件号包含空格:

3864205010  J

当我查询数据库或搜索phpMyAdmin中的零件时,不会返回任何结果。

然而,当我delete2个空格,然后再次键入时,搜索会返回结果。

此查询不返回结果:

SELECT * 
FROM  `parts` 
WHERE  `part_no` LIKE  '3864205010  K'

此查询返回结果:

SELECT * 
FROM  `parts` 
WHERE  `part_no` LIKE  '3864205010  K'

它们看起来是一样的,但在第二个查询中,我删除了"K"之前的2个空格,并再次键入空格。

如果可以使用通配符而不是空格:

SELECT * 
FROM  `parts` 
WHERE  `part_no` LIKE  '3864205010%K'

这可能不是空格,而是HTAB(ascii代码9(,甚至是换行/回车(10和13(。复制粘贴在一个好的文本编辑器中,你会看到它到底是什么。

现在,关于为什么即使看起来像一个空间,它也不起作用,这是因为我们看到的的每一个字符都是由引擎(记事本、phpmyadmin、firefox…任何具有文本渲染的软件(解释的

实际情况是,当引擎找到一个ascii代码时,它会将其转换为可见字符。例如,CHAR(9(经常被转换为一个"大空间",通常等于2或4个空间。但是phpmyadmin可能只是决定不这样做。

另一个例子是换行(CHAR(10((。在文本编辑器中,这将是行结束的信号,并且(在unix系统中(必须开始一行新行。但您可以将这个换行符复制到数据库字段中,只是不确定它将如何渲染。因为他们想让你看到细胞中的一切,他们可能会选择将其渲染为一个空间。。。但如果你看一下它的ascii代码,那就不是一个空格了(这里没有技巧,所有的渲染引擎都会告诉你正确的ascii码(。

这一点很重要,始终使用字符的ascii代码来处理字符。


上面有一个答案建议使用通配符而不是空格。这可能匹配,也可能不匹配。假设您的字符串是"386420K5010",所以它不是您要查找的字符串,LIKE"3864205010%K"模式仍然会返回它。最好的方法可能是使用正则表达式,或者至少确定这些字符串的固定模式。

是的,作为更新的问题,如果你想删除更多的空间,其中内容之间可能有3或4个空间,那么查询将使用完整的

SELECT REPLACE( REPLACE( part_no, " ", " " ), " ", " " ) from parts.

让我知道这是否适合你?

SELECT * 
FROM  `parts` 
WHERE  REPLACE(REPLACE(`part_no`, CHAR(9), ''),' ','') LIKE  REPLACE(REPLACE('3864205010  K', CHAR(9), ''),' ','')

如果part_no和/或搜索字符串具有制表符和/或空格,这可能会起作用。