用它们的ASCII对应字符替换所有特殊Unicode字符

3
我有一个编码为utf8-general-ci的字段,其中许多值包含非ASCII字符。我想要:
  1. 搜索所有包含任何非ASCII字符的字段

  2. 将所有非ASCII字符替换为其对应的 ASCII 版本。

例如:côte-d'ivoire 应替换为 cote-d-i'voire,são-tomé 应替换为 sao-tome 等。
如何实现这一点?如果我只是将字段类型更改为 ASCII,则非 ASCII 字符将被替换为“?”。我甚至无法使用搜索找到所有这样的字段。
RLIKE '%[^a-z]%'

例如
SELECT columname 
FROM tablename 
WHERE NOT columname REGEXP '[a-z]';

返回一个空集合。
谢谢。

“非 ASCII 字符” 是什么意思?这些值是否已正确编码为 utf8,或者您是否遇到了编码问题? - Bjoern
请注意,"ô" 不是 "ASCII"。US-ASCII 是仅包含英文字母的 7 位范围。"côte-d'ivoire" 的例子应该变成 "côte-d-ivoire",因为 1. "ô" 不是 ASCII,2. 单引号字符没有问题。 - SineSwiper
3个回答

3

1
谢谢,这非常有帮助。虽然自动转换可能需要更多的步骤(自定义函数?),但暂时这个方法会对我有所帮助。 - workwise
https://dev59.com/6XE85IYBdhLWcg3wgDvd 可以帮助实际删除。 - skv
1
我不认为原帖作者想要删除实际的非ASCII字符,而是用ASCII等效字符替换它们。因此,https://dev59.com/o2865IYBdhLWcg3wZdtW可能更相关。 - Llanilek
1
话虽如此,我们不能仅仅假设 OP 正在使用 Python 或 Django。如果他们正在使用 Python,则 https://pypi.python.org/pypi/Unidecode/0.04.1 将完美地工作。鉴于他们大部分问题都是基于 PHP 的,我怀疑他们不会使用 Python。 - Llanilek

1
在Perl中,您可以使用Text::Unidecode
在MySQL中,没有简单的函数可以将utf8(或utf8mb4)转换为ascii,而不会产生一些丑陋的“?”字符作为替换。最好在将它们插入数据库之前进行替换,或者在Perl(或其他任何语言)中运行某些程序来提取数据并逐行重新更新它们。

有许多不同语言的Text::Unidecode端口:PythonPHPJavaRubyJavaScriptHaskellC#ClojureGo


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接