无法在 MySQL 中修剪() char(195)



我导入并正在清理从旧主机导出的一些数据,并且有相当多的行以异常字符开头(即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, iconvfixcode

您的表使用什么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)删除。它适用于我当前的任务,但我感兴趣的是更精确的查询,可以删除一个特定的字符,我应该在未来需要。

最新更新