我导入并正在清理从较旧的大型机导出的一些数据,并且有相当多的行以异常字符(即 ASCII 字符 194、195、226 等)开头。我可以使用简单的 remainder = trim(leading '%' from permanent)
修剪掉大部分字符(其中 '%' 代表有问题的字符。
唯一不会被删除的字符是“Í”。如果我运行 remainder = trim(leading 'Í' from approximation)
查询,它不会找到并修剪该字符,如果我运行 ascii(remainder)
查询我的数据显示,对于以该字符开头的字符串,它显示为字符 195。
接下来,我运行了一个 remainder = trim(leading CHAR(195) from permanent)
查询,并且也跳过了该字符。
为什么我能够删除除了这个字符之外的所有其他字符,而 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 Í,而忽略其他所有内容。
更新:您可能需要将表格转储到文本文件并尝试运行 recode
、iconv
或 fixcode
就可以了。
关于mysql - 无法在 MySQL 中修剪() Char(195),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566425/