REPLACE()可以使重音不敏感(é= e)吗?

时间:2013-07-08 07:38:39

标签: mysql utf-8 character-encoding collation

我有一张使用UTF-8- default整理的表格。

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

当我执行以下查询时:

 select * from company where name ='Cafe Rouge'

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

所以,

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

给了我'Café Rougz',即它不会将é替换为z

任何建议都会很明显

5 个答案:

答案 0 :(得分:1)

我认为你可以做的好事之一是保持第二列,使这些字符串保持正常形式;例如,这个专栏将举行“Cafe Rouge”而不是“CaféRouge”。您可以在查询中投影特殊字符,然后使用普通表单列进行查询。

答案 1 :(得分:1)

尝试

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

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

答案 2 :(得分:0)

我认为你不能那样做。更安全的赌注是简单地替换那些特定的角色。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

你可以使用CONVERT()规范化mySQL中的字符串,如@Christian所示,但这会破坏任何其他非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. 标准化角色
  6. 如果标准化字符产生e,您就知道需要在字符串中替换它。

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

  8. 然而,对于看起来很小的东西来说,这看起来很麻烦。你确定有必要吗?