我导入并正在清理从旧主机导出的一些数据,并且有相当多的行以异常字符开头(即ASCII字符194,195,226等)。我可以用一个简单的remainder = trim(leading '%' from remainder)
(其中'%'表示有问题的字符)修剪掉大多数字符。
唯一不会被删除的字符是'Í'。如果我运行remainder = trim(leading 'Í' from remainder)
查询,它不会找到并修剪字符,如果我运行ascii(remainder)
查询我的数据,它显示为以该字符开头的字符串的字符195。
接下来,我运行了一个remainder = trim(leading CHAR(195) from remainder)
查询,它也跳过了字符。
为什么我能够删除一切,但这一个字符时,显然MySQL可以将其转换为它的ASCII字符代码,并没有任何问题显示字符时,正常的选择查询运行和适用的记录显示?
我还运行了以下查询:
remainder = trim(leading convert('Í' using ASCII) from remainder)
remainder = trim(leading convert('Í' using UTF8) from remainder)
remainder = trim(leading convert(Char(195) using ASCII) from remainder)
您的查询在我的MySQL (5.5.44-0ubuntu0.14.04.1)上工作正常
可能它不适合你的原因是,由于字符集不匹配,你看到的作为字符195 根本不是字符195 ;例如,它可能是0xCD十六进制,或对应于0xC38D十六进制的UTF8序列,在这种情况下,修剪'Í'显然会将其转换为更奇怪的东西。
尝试使用HEX()检查有问题的字符。这是什么?
CD Latin1 Í
C38D UTF8 Í <---
C3 CHAR(195)
注意Í是而不是一个CHAR(195),但是195 是在UTF8中Í的开头。
必要时,您可以执行操作…在十六进制。
select unhex(trim(leading 'C38D' from HEX('Íturalde')));
+---------------------------------------------------+
| unhex(trim(leading 'C38D' from HEX('Íturalde'))) |
+---------------------------------------------------+
| turalde |
+---------------------------------------------------+
这将仅修剪前导C38D或UTF8 Í,而忽略其他所有内容。
UPDATE:你可能想把你的表转储到一个文本文件,并尝试在它上运行recode
, iconv
或fixcode
您的表使用什么CHARSET
?
如果您确定表中有ASCII数据并且字符代码正确,则TRIM
函数没有问题。
因此,在查询之前,只需找出您的数据表甚至列CHARSET。
http://sqlfiddle.com/!9/1cfe9/5
SELECT TRIM(LEADING CHAR(195) FROM field1)
, field1
from t1
所以我终于找到了一个方法。使用
remainder = trim(leading Char(195) from convert(remainder using ASCII))
我终于能够摆脱那个讨厌的'Í'。我唯一担心的是,它真的没有修剪,它把所有的ASCII字符超过127,通常会落入'扩展ASCII'代码列表变成'?然后可以用remainder = trim(leading '?' from remainder)
删除。它适用于我当前的任务,但我感兴趣的是更精确的查询,可以删除一个特定的字符,我应该在未来需要。