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

时间:2015-07-22 14:42:02

标签: mysql sql ascii

我已导入并正在清理从较旧的主机导出的一些数据,并且有很多行以异常字符开头(即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字符代码时,在运行正常的选择查询并显示适用的记录时显示字符没有任何问题?< / p>

更新 我还运行了以下查询:

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)

3 个答案:

答案 0 :(得分:1)

您的查询在我的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中Í的开头。< / p>

在紧要关头,你可以用十六进制执行操作。

select unhex(trim(leading 'C38D' from HEX('Íturalde')));
+---------------------------------------------------+
| unhex(trim(leading 'C38D' from HEX('Íturalde')))  |
+---------------------------------------------------+
| turalde                                           |
+---------------------------------------------------+

这将修剪一个领先的C38D或UTF8Í,而忽略其他所有内容。

更新:您可能希望将表格转储为文字文件,然后尝试在其上投放recodeiconvfixcode

答案 1 :(得分:0)

所以我终于找到了方法。使用

remainder = trim(leading Char(195) from convert(remainder using ASCII))

我终于摆脱了那个讨厌的'Í'。我唯一担心的是,它确实没有修剪,它将超过127的ASCII字符的全部转换为通常属于'扩展ASCII'代码列表的'?'然后可以使用remainder = trim(leading '?' from remainder)删除它。它适用于我当前的任务,但我对更准确的查询感兴趣,可以在将来需要删除特定字符。

答案 2 :(得分:0)

你用什么CHARSET

如果您确定表中有ASCII数据并且字符代码正确,则TRIM函数没有问题。

所以在查询之前,先找出你的数据表甚至列CHARSET。

http://sqlfiddle.com/#!9/1cfe9/5

SELECT TRIM(LEADING CHAR(195) FROM field1)
, field1
from t1