隐藏字符的MYSQL查询失败?

时间:2015-09-16 18:52:05

标签: mysql

我一直试图围绕一个可能的隐藏价值。

每当我运行此查询时

SELECT * FROM LIST WHERE `GROUP_2` = "Yes";

我得到0结果。

每当我运行时:

SELECT * FROM LIST WHERE `GROUP_2` LIKE 'Yes%';

我能够取得结果。

我尝试了许多不同的导出和导入参数,使用MySQL加载数据进行csv导入,但没有任何作用。 GROUP_1和GROUP_2都设置为varchar(55)

我可以运行哪些查询来确定原因或检测隐藏的分隔线?

ID  name    GROUP_1 GROUP_2
1   Bob     No      Yes
2   Jim     Yes     No

3 个答案:

答案 0 :(得分:5)

要确定问题所在,您可以使用HEX功能:

SELECT group_1, HEX(group_1)
FROM table
WHERE group_1 LIKE 'Yes%' AND group_1!='Yes'

是的,应编码为596573(取决于使用的代码集可能会有所不同),但您会看到其后的其他字符。

修改

我建议您找到根本原因并修复文本文件或导入过程。但是,如果您想在不进行新导入的情况下修复现有数据,则有多种选择。

您可以关注xQbert链接(感谢您的链接!):

update table SET group_2 = TRIM(TRAILING '\n' FROM group_2);

或修正自己的查询:

UPDATE TABLE set GROUP_2 = replace(replace(GROUP_2,'\n',''), '\r', '');

或者如果您只有/没有值:

UPDATE TABLE set GROUP_2='Yes' WHERE group_2 LIKE 'Yes%' AND group_2!='Yes';
UPDATE TABLE set GROUP_2='No' WHERE group_2 LIKE 'No%' AND group_2!='No';

答案 1 :(得分:3)

嘿,大家都非常感谢大家。

@Uueerdo,@ fthiella,@ Rahul,

我的原始问题是由源数据以及我用于导入文件的方法引起的。

每当我直接使用等于查询时,我都不会返回一个值,当使用LIKE“是%”时就会这样。

使用以下内容:

SELECT GROUP_2, HEX(GROUP_2)
FROM QUEUE
WHERE GROUP_2 LIKE 'Yes%';

这有助于识别添加的0D十六进制,这是回车导致查询失败。

快速修复此问题是使用以下内容更新字段..

UPDATE QUEUE set GROUP_2 = replace(GROUP_2,'\r','');

但是,因为每次更新数据时都需要这样做,所以我发现了在原始LOAD DATA中可以识别滑架的位置。使用的原始语法是:

LINES TERMINATED BY '\n' 

然后我改为

LINES TERMINATED BY '\r' 

这允许源数据保持不变。

由于 再次:))

答案 2 :(得分:2)

我自己从未尝试过,但认为这会识别出任何与“隐形”无关的行。字符。

SELECT * 
FROM theTable 
WHERE field REGEXP '[^[:graph:] ]+' --This allows spaces, even leading/trailing ones
OR field <> TRIM(field) --This catches those spaces
;

它并不识别或修复有问题的字符,只是在该字段中包含它们的行。