3

我有一个带有编码的字段,utf8-general-ci 其中许多值包含非 ascii 字符。我想要

  1. 搜索包含任何非 ASCII 字符的所有字段

  2. 用相应的ascii 版本替换所有非 ascii 字符。

例如:côte-d'ivoire应该换成cote-di'voire,são-tomé应该换成sao-tome等。

我如何实现这一目标?如果我只是将字段类型更改为 ascii,非 ascii 字符将被替换为“?”。我什至无法使用搜索所有此类字段

RLIKE '%[^a-z]%'

例如

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

返回一个空集。

谢谢

4

3 回答 3

3

一个 sql fiddle 示例位于

http://www.sqlfiddle.com/#!2/c1d90/1/0

要选择的查询是

select * from test where maintext rlike  '[^\x00-\x7F]'

希望这可以帮助

于 2013-08-22T04:40:22.537 回答
1

我从您之前的问题中推测您正在使用 PHP。

https://github.com/silverstripe-labs/silverstripe-unidecode

然后,您可以使用skv的答案返回您希望使用的对象,然后使用 unidecode 尝试将对象转换为它的 ascii 等价物。

于 2013-11-04T14:27:27.627 回答
1

在 Perl 中,您可以使用Text::Unidecode

在 MySQL 中,没有一个简单的函数可以将 utf8(或 utf8mb4)转换为 ascii,而不会吐出一些难看的“?” 字符作为替换。最好在将它们插入数据库之前替换它们,或者在 Perl(或其他)中运行一些东西来提取数据并一次重新更新一行。

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

于 2014-12-05T22:34:24.197 回答