我一直试图围绕一个可能的隐藏价值。
每当我运行此查询时
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
答案 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
;
它并不识别或修复有问题的字符,只是在该字段中包含它们的行。