2011-10-15 29 views
2

好的,這是在擾亂我。 我從一個客戶端的電話簿數據庫,其中一些結果containts重音名稱,根據口音找到重複的字段

和一些我的意思是主要是城市領域,或類別。 這使我的查詢結果看起來很荒謬。

DB字符集:UTF-8

例如:

公司名稱|城市| etc ...

DemoCompany | Hauptstraße18 |無論

DemoCompany | Hauptstrabe 18 |無論

DB有大約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$$ 
+0

發表表格的定義。我們知道這一點,尤其是使用的字符集和排序規則。 –

+0

一切都被定義爲UTF-8,事情是,我認爲這個數據庫是手動輸入,有時與口音,有時沒有。我相信它不是數據庫問題。 – Dementic

+0

'charset'是'utf8'。什麼是整理? –

回答

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'

+0

您的第二個響應正是我所需要的。我會嘗試按照你的指示,看看會發生什麼。 – Dementic

0

你不僅要考慮的口音,但許多其他等效字符:

  • 在德國,你可以寫「SS」爲「SS」,一爲「AE」,「U」爲「UE '等
  • 意大利語和法語你可以搜索沒有口音的字母,但口音有時也用撇號替代(例如,意大利語giocheròas giochero')

如果發現編寫函數,則比較字符串而不考慮這些差異,或者您可以嘗試使用利用語音差異的函數進行匹配。

的例子是(很多數據庫實現它們):

  • 探測法
  • 距離相似
  • 哈羅溫克勒

MySQL有一個SOUNDEX功能,換了別人,你必須定義你自己的功能(網上有幾個例子)。

結果並不完美,但尋找類似的條目將有助於手動檢查。

+0

我同意一般的看法,但MySQL的'SOUNDEX()'不能幫助你。從你給的鏈接:'重要: 當使用SOUNDEX應注意以下限制: 此功能目前正在實施中,只適用於僅使用英語的字符串,其他語言的字符串可能不會產生可靠的結果 此功能不保證爲使用的字符串提供一致的結果多字節字符集,包括utf-8。 ' –

+0

是sounde是爲英語設計的,但在我們的情況下,德語給出的結果並不那麼糟糕。這不會是完美的,但將有助於確定雙重條目。 – Matteo

0

我很確定這是一個phonetic search的情況。您可以創建一個臨時(可能位於內存的表)表,將該行的語音等價物插入到該表中,然後計算有多少重複項。這對名稱(邁耶,梅耶)以及街道(Straße,Strasse)非常有效。