joost, я сегодня что-то туго соображаю. Как я понимаю: 1. Есть какой-то большой текст. 2. Ты делаешь из него md5 хэш. 3. В таблице есть поле CHAR(32) и по нему сделан уникальный индекс 4. Ты туда запихиваешь md5 хэш и по нему определяешь есть ли у тебя такой текст уже в таблице или нет. Такая схема вполне себе работает и все отлично. (За исключением времени создания MD5 хэша от ОЧЕНЬ больших текстов/файлов). Я все правильно понял?
ну, для субд любые данные - набор байтов. и в индексе хранится не число 1 или строка "птыцо дурак", а соответствующие им наборы байтов.
да да нет. есть поле text - в нем хранится текст. по нему (по тексту) сделан уникальный индекс (это md5() от текста) полем bigint(20) в отдельное поле bigint(20) Например code_model, name_model md5(телефон Lg B1300 с наушниками и т. д.), телефон Lg B1300 с наушниками и т. д. Проблема в том, что md5(телефон Lg B1300 с наушниками и т. д.) это будет число в 16 ричной системе числения, а в БД в поле bigint(20) записывается простое число (не уверен, но наверное в 10 ричной системе). Как формируется это число, которое записывается в таблицу БД? Будет ли оно уникальным?
joost, Чисто ИМХО, на истину не претендую: 1. Максимальное значение которое можно хранить в BIG INT Unsigned: 2^64 = 18446744073709551616 2. md5 хэш - 128 бит. => 2^128 = 3,4028236692093846346337460743177e+38 Итого либо взять столбец типа DOUBLE, либо индекс делать по CHAR(32) и не парить себе мозг.
тоесть обрезать текст до 32 символов? уникальный индекс делать отдельным полем (md5 от строки в bigint(20) ) таблици или текстовое поле (обрезаное до 32 ) делать уникальным индексом?
как сделать уникальным индекс по текстовому полю? там вроде длину индекса (количество символов, которые учитывать) надо указывать. как это делать? какой сиснтаксис запроса на создание такого индекса?
joost, ты захавал мой мозг. Весь до последней капли. Цени алгортим: 0. Делаешь ALTER TABLE `table_name` ADD `hash` CHAR( 32 ) NOT NULL 1. Делаешь ALTER TABLE `table_name` ADD UNIQUE (`hash`) 2. Делаешь md5 хэш своего большого текста. 3. Получившийся хэш размером 32 символа пишешь в БД. 4. Радуешься уникальному хэшу своего большого текста и пишешь, что тему можно закрывать. Это нужно делать, если ты делаешь индекс по полю типа TEXT. Мы же его делаем по CHAR(32). Поэтому все будет ок и так.
ну, в принципе, если никаких арифметических операций не предвидится, то можно попробывать и unsigned, однако в справке рекомендуется не юзать значения больше 2^63 joost у varchar переменная длина при хранении, плюс хранится байт длины (и потому длина не может быть более 255 буковок)
Там всё несколько сложнее. 65к это максимальное число, которое могут разделить между собой варчар столбцы.
Ну он туда md5 хэш планировал просто кидать. А не рекомендуется больше 63 бит держать только при выполнении арифметических операций (не битовых)..