SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.11.2007 07:09:37

Юрий
Участник
Откуда: Владивосток
Зарегистрирован: 09.11.2007
Сообщений: 12

Отсев дубликатов при записи данных

Подскажите, можно ли фильтровать дублирующиеся данные при добавлении в базу. Для этого есть какие-нибудь специальные операторы? Как например сделать чтобы записывались только уникальные e-mail адреса?

Неактивен

 

#2 09.11.2007 10:11:07

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Отсев дубликатов при записи данных

Чтобы добиться такого эффекта, нужно следующее:

1. Таблица должна иметь уникальный ключ на столбце, который должен
хранить уникальные значения, т.е.

CREATE TABLE t (
    email VARCHAR(255)  CHARACTER SET latin1,
    UNIQUE KEY (email)
);

Если важна производительность, то лучше сделать индекс не по всему
столбцу, а по его части; при этом стоит задуматься, сколько символов
достаточно, чтобы считать данную запись уникальной. Например, если
достаточно 15 символов:
UNIQUE KEY(email(15))

Если Вы собираетесь хранить именно e-mail'ы, то рекумендую использовать
для соотв. столбца кодировку latin1 - так сэкономите место на диске и
память для индекса, поскольку нелатинские символы Вам все равно не
понадобятся.

2. При заполнении вашей таблицы используйте конструкцию INSERT IGNORE:

INSERT IGNORE INTO t (email) VALUES ('user@host.ru')

Модификатор IGNORE предписывает игнорировать запись при совпадающем значении уникального ключа, и Вы как раз добьетесь того, что нужно.

Неактивен

 

#3 09.11.2007 10:16:34

Юрий
Участник
Откуда: Владивосток
Зарегистрирован: 09.11.2007
Сообщений: 12

Re: Отсев дубликатов при записи данных

А в таблице могут быть дополнительные столбцы?
на пример: id | mail | pass | name

Неактивен

 

#4 09.11.2007 10:23:56

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Отсев дубликатов при записи данных

Да, конечно.
Более того, можно иметь в одной таблице сколько угодно уникальных ключей.

Неактивен

 

#5 09.11.2007 10:27:17

Юрий
Участник
Откуда: Владивосток
Зарегистрирован: 09.11.2007
Сообщений: 12

Re: Отсев дубликатов при записи данных

А для хранения паролей есть какие-нибудь средства? Шифровка и т.п.
Я хочу сделать систему авторизации пользователей php + mysql

Неактивен

 

#6 09.11.2007 10:49:20

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Отсев дубликатов при записи данных

Специальных встроенных средств конкретно для паролей нет.
Тем не менее, имеющийся инструментарий позволяет весьма с ними работать: например, можно хранить пароли в виде в виде MD5-хэша. Для этого в таблице под пароли выделяется столбец типа CHAR(32) (MD5-ключ всегда имеет длину 32 символа, поэтому в данном случае лучше всего подходит именно тип CHAR).
Как в PHP, так и  в MySQL в современных версий имеется функция md5().

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

Учтите, что недавно в MD5 нашли дубликаты:
http://ru.wikipedia.org/wiki/MD5
http://eprint.iacr.org/2006/105
но Вам вряд ли придется с этим столкнуться.

Неактивен

 

#7 09.11.2007 10:51:56

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Отсев дубликатов при записи данных

Более защищенным считается hash-алгоритм sha1(), который также есть и в PHP и в MySQL. Если разработываете новую систему, то лучше сразу спроектировать ее так, что пароли будут хранится в виде sha1() хэша.

Неактивен

 

#8 09.11.2007 11:55:16

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Отсев дубликатов при записи данных

LazY написал:

Если Вы собираетесь хранить именно e-mail'ы, то рекумендую использовать
для соотв. столбца кодировку latin1 - так сэкономите место на диске и
память для индекса, поскольку нелатинские символы Вам все равно не
понадобятся.

Это неверно и лучше на это не полагатся никогда.
RFC-822 не накладывает никаких ограничений на набор возможных символов в адресе электронной почты. Более того, в нем возможны даже комментарии, не помню точного примера, но что то типа такого:

<vasya_"да, это мой email"_pupkin@васин.домен>

- это корректный адрес электронной почты с точки зрения RFC.

другое дело, что это никто пока не использует (разве что в локальных корпоративных почтовых системах), но я бы не стал зарекаться от того, что это случится smile

Неактивен

 

#9 09.11.2007 12:02:54

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Отсев дубликатов при записи данных

<vasya_"да, это мой email"_pupkin@васин.домен>

- это корректный адрес электронной почты с точки зрения RFC.

Ни разу таких адресов нигде не видел (максимум что видел из не-word-символов - точка).
Впрочем, действительно. Раз в стандарте написано - тогда пренебрегать этим только на свой страх и риск.

Неактивен

 

#10 09.11.2007 15:35:00

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Отсев дубликатов при записи данных

Shopen написал:

Это неверно и лучше на это не полагатся никогда.
RFC-822 не накладывает никаких ограничений на набор возможных символов в адресе электронной почты. Более того, в нем возможны даже комментарии, не помню точного примера, но что то типа такого:

<vasya_"да, это мой email"_pupkin@васин.домен>

- это корректный адрес электронной почты с точки зрения RFC.

другое дело, что это никто пока не использует (разве что в локальных корпоративных почтовых системах), но я бы не стал зарекаться от того, что это случится smile

Даже если такой адрес будет, все равно непонятно в какой кодировке его хранить. В UTF8? Я не видел пока стандарта, в котором указано, какую кодировку должен понимать DNS, например. Так, что такие email адреса все равно приведут к проблемам при их появлении, придется обрабатывать особым образом.

Неактивен

 

#11 09.11.2007 20:26:44

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Отсев дубликатов при записи данных

основная мысль - не порождать потенциальные проблемы в будущем.

а проблема DNS-серверов не относится к хранению адресов в базе mysql, хотя сама она существует и давно обсуждается. Наверно все слышали про русские доменные имена? их хотели ввести уже давно, я про это слышал еще года 4-5 назад. Но ввести не могут я так понимаю именно потому, что требуется написать кучу регламентов(RFC) использования нац. алфавитов и как следствие софта smile
Если бы во времена появления DNS таковых учли бы проблему кодировок, то мы давно бы имели домены типа "вовка.ру".
Но ничего не поделаешь сеть вышла из ARPANET а не из какого нибудь ГЛОНАСС-а smile

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

Неактивен

 

#12 10.11.2007 00:38:39

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Отсев дубликатов при записи данных

Или были бы домены БНБЙЮ.ПС (вместо вовка.ру). При проектировании базы учесть те стандарты, которых нет - практически невозможно. Хвататься за голову будут те, у кого такие адреса, так как с ними работать не будет ничего несколько лет, кроме, возможно, случайных совпадений. Большинство современных веб-приложений сочтут такие адреса невалидными.

Таблицу с email-адресами можно конечно сделать UTF8 (ведь email может быть и на японском), но боюсь одно это не поможет.

Неактивен

 

#13 15.06.2008 16:16:37

Юрий
Участник
Откуда: Владивосток
Зарегистрирован: 09.11.2007
Сообщений: 12

Re: Отсев дубликатов при записи данных

Модификатор IGNORE предписывает игнорировать запись при совпадающем значении уникального ключа, и Вы как раз добьетесь того, что нужно.

А как перед добавлением информации проверить, запись существует или не существует?
Такой запрос: INSERT IGNORE INTO t (email) VALUES ('user@host.ru')
выполниться успешно в случае если запись дублируется либо если запись уникальна.

Неактивен

 

#14 15.06.2008 20:20:18

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Отсев дубликатов при записи данных

С помощью php-функции mysql_affected_rows()  (или SQL-функции ROW_COUNT()) Вы можете узнать сколько строк реально изменилось. Будет 1 - если вставлена новая запись или 0 - если дубликат. Перед добавлением можно проверить наличие записи с помощью SELECT.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson