根据重音找到重复的字段

时间:2011-10-15 16:25:45

标签: mysql select diacritics

好吧,这让我烦恼。 我从客户端获得了一个电话簿数据库,其中一些结果包含重音名称,

有些我的意思主要是城市领域或类别。 这让我的查询结果看起来很荒谬。

DB Charset:UTF-8

例如:

CompanyName |城市|等...

DemoCompany | Hauptstraße18|无论

DemoCompany | Hauptstrabe 18 |无论

数据库有大约360k的记录....所以手动检查不是一个选项。 任何人都有一个想法如何找到重音/非重音值? 类似于重复列检查......

编辑: 当我查询表时,我得到两者的结果,这不是问题。 问题是,当我显示结果时,一些显示带有重音,一些显示没有。

编辑:

CREATE TABLE `enc` (
  `company` varchar(255) DEFAULT NULL,
  `address` varchar(255) DEFAULT NULL,
  `postcode` varchar(255) DEFAULT NULL,
  `city` varchar(255) DEFAULT NULL,
  `Telefon1` varchar(255) DEFAULT NULL,
  `Telefon2` varchar(255) DEFAULT NULL,
  `Telefon3` varchar(255) DEFAULT NULL,
  `Telefon4` varchar(255) DEFAULT NULL,
  `Telefon5` varchar(255) DEFAULT NULL,
  `Branche1` varchar(255) DEFAULT NULL,
  `Branche2` varchar(255) DEFAULT NULL,
  `Branche3` varchar(255) DEFAULT NULL,
  `Branche4` varchar(255) DEFAULT NULL,
  `Branche5` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

3 个答案:

答案 0 :(得分:1)

你可以从这样的事情开始,这将显示是否存在彼此完全重复的行(以及它们的计数):

SELECT 
    CompanyName, City, etc... 
  , COUNT(*) AS DuplicateCount
FROM 
    TableToCheck
GROUP BY
    CompanyName, City, etc...            --- all columns except the Primary Key
HAVING 
    COUNT(*) > 1

如果您只想查找重复的地址,请执行以下操作:

SELECT 
    Address
  , COUNT(*) AS DuplicateCount
FROM 
    TableToCheck
GROUP BY
    Address                     
HAVING 
    COUNT(*) > 1

再次阅读你的问题,我想我误解了你在问什么。如果您不想找到重复项(因为没有),但您想要找到带重音的单词(并且可能用非重音替换它们):

您现在拥有的表可能使用不区分大小写的排序规则(如utf_general_ciutf_unicode_ci),因此您可以将表复制到具有相同字符集但区分大小写的排序规则的新表中,比如utf_bin

然后,您可以创建重音字符列表,然后编写查询以在新表的字段中检查此列表(这将非常慢):

SELECT nt.*
FROM NewTable AS nt 
  JOIN AccentedList AS al
WHERE nt.field LIKE CONCAT('%', al.AccentedChar, '%')
GROUP BY nt.PK

或对REPLACE()这些字符运行查询,例如'ß''ss'

答案 1 :(得分:0)

您不仅需要考虑重音,还需要考虑许多其他等效字符:

  • 在德语中你可以把'ß'写成'ss',ä作为'ae','ü'写成'ue'等等
  • 在意大利语和法语中你可以搜索没有重音的字母,但口音有时也会用撇号代替(例如,giocherò作为意大利语中的giochero)

如果发现编写一个函数,则在不考虑这些差异的情况下比较字符串,或者您可以尝试使用利用语音差异的函数进行匹配。

示例是(许多数据库实现它们):

  • 探测法
  • 距离相似度
  • Jaro Winkler

Mysql具有SOUNDEX功能,对于其他功能,您必须定义自己的功能(网上有几个例子)。

结果并不完美,但寻找类似的条目有助于手动检查。

答案 2 :(得分:0)

我很确定这是phonetic search的情况。您可以创建一个临时(可能的内存位置)表,将行的语音等效项插入其中,然后计算重复数量。这对于名字(Meyer,Mayer)以及Streets(Straße,Strasse)非常有效。