12

我有一个使用UTF-8- default排序规则的表。

我在此表中有一个名为的列company具有此值Café Rouge

当我进行如下查询时:

 select * from company where name ='Cafe Rouge'

它列出了这家公司,因为它处理字符é =e,但是当我使用替换命令时,它不处理 ée.

所以,

select replace('Café Rouge','e','z')  

给我'Café Rougz',即它不替换éz.

任何建议都将是可观的

4

5 回答 5

1

尝试

SELECT REPLACE(CONVERT(name USING ascii), 'e', 'z')

name在进行替换之前将列转换为 ASCII。

于 2013-07-08T07:55:59.567 回答
1

我认为您可以做的一件好事是维护第二列,使这些字符串保持正常形式;例如,此列将包含“Cafe Rouge”而不是“Café Rouge”。您可以在查询中投影异常字符,然后使用普通表单列进行查询。

于 2013-07-08T07:53:44.170 回答
0

为什么不对café rouge 进行选择,并在每个返回的结果中替换所需的列?

于 2013-07-08T07:54:54.337 回答
0

您需要在 mySQL 之外执行此操作。

您可以规范化 mySQL 中的字符串,如 @Christian using 所示CONVERT(),但这会破坏存在的任何其他非 ASCII 字符:

Bürgercafé Römer 

最终会

Burgercafz Romer

来自其他字符集(如西里尔文或中文)的字符将被完全删除。

最好的办法是专门替换所有要替换的字符。

replace('Café Rouge','e','z')  
replace('Café Rouge','é','z')  
replace('Café Rouge','è','z')  

完全按照您的意愿行事,您必须将每个字符串加载到像 PHP 这样的编程语言中。

在那里,您可以执行以下操作:

  1. 从数据库中加载字符串;确保它是 UTF-8

  2. 将字符串拆分为其字符(注意多字节字符 - 使用mb_split()

  3. 遍历每个角色

  4. 使用规范化字符iconv($character, "UTF-8", "ASCII//TRANSLIT");

  5. 如果标准化字符导致e,您知道您需要在字符串中替换它。

  6. 将更改后的字符串写回数据库。

然而,这对于看似很小的事情来说似乎是一个非常大的麻烦。你真的确定有必要吗?

于 2013-07-08T08:03:30.443 回答
0

我不认为你能做到这一点。更安全的选择是简单地对这些特定字符进行替换。

于 2013-07-08T07:51:29.010 回答