поиск дубликатов полей на основе акцента - PullRequest
2 голосов
/ 15 октября 2011

хорошо, это меня беспокоит.я получил базу данных телефонной книги от клиента, где некоторые результаты содержат акцентированные имена,

, а под некоторыми я подразумеваю главным образом поле города или категорию.что делает мои результаты запроса смешными.

БД Charset: UTF-8

например:

CompanyName |Город |и т.д ...

ДемоКомпания |Хауптштрассе 18 |Безотносительно

ДемоКомпания |Hauptstrabe 18 |Что бы там ни было

, в БД содержится около 360 тыс. Записей .... поэтому ручная проверка не возможна.У кого-нибудь есть идея, как я могу найти акцентированные / не акцентированные значения?что-то вроде проверки дубликатов столбцов ...

РЕДАКТИРОВАТЬ: когда я запрашиваю таблицу, я получаю результаты для обоих, это не проблема.проблема в том, что когда я отображаю результаты, некоторые отображаются с акцентом, а некоторые без.

РЕДАКТИРОВАТЬ:

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 ]

1 голос
/ 15 октября 2011

Вы можете начать с чего-то подобного, который покажет, есть ли строки, которые являются точными дубликатами друг друга (и их количество):

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_ci или utf_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 голосов
/ 15 октября 2011

Я почти уверен, что это случай фонетического поиска . Вы можете создать временную (возможно, расположенную в памяти) таблицу, вставить в нее фонетический эквивалент строки, а затем подсчитать, сколько дубликатов. Это очень хорошо работает для имен (Мейер, Майер), а также улиц (Штрассе, Штрассе).

0 голосов
/ 15 октября 2011

Вам нужно учитывать не только акценты, но и множество других эквивалентных символов:

  • на немецком языке вы можете написать 'ß' как 'ss', ä как 'ae', 'ü' как 'ue' и так далее
  • на итальянском и французском языках вы можете искать буквы без ударения, но ударение также иногда заменяется апострофом (например, giocherò as giochero 'на итальянском языке)

Если найдено, напишите функцию, которая сравнивает строки без учета этих различий, или вы можете попытаться сопоставить, используя функцию, которая использует фонетические различия.

Примеры (многие базы данных реализуют их):

  • Саундэкс
  • Расстояние сходства
  • Джаро Винклер

Mysql имеет функцию SOUNDEX, для остальных вам придется определить свою собственную функцию (в Интернете есть несколько примеров).

Результаты не идеальны, но поиск похожих записей поможет проверить вручную.

...