Alexanevsky
@Alexanevsky
Любительская web-разработка

В чём принципиальная разница между INT(3) и VARCHAR(3)?

Предположим, в ячейки базы данных MySQL мне надо хранить некоторый набор цифр от 0 до 100.

В чём принципиальная разница между INT(3) и VARCHAR(3)?

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

Единственное отличие, которое я вижу, это то, что в случае отсутствия информации INT будет содержать 0, а VARCHAR не будет содержать ничего, что, большому счёту, одно и тоже, так как оба они в случае отсутствия информации выдадут FALSE...

UPD:

У меня просто ситуация следующая.
Есть две таблицы: _users и _users_log c идентичными полями. В первой находится информация о пользователях, во второй логи её изменений (добавляется новая строка, в _users просто информация меняется). При изменении информации в лог отправляются данные ТОЛЬКО в том случае, если они были изменены.

Проблема с следующем. Есть какой-нибудь столбец, который может принимать значения 0, 1 или 2. Пусть будет INT. Но так как информация в столбец с таблице логов заносится только если она была изменена, то в случае, если этот столбец пользователь не изменил, будет 0. И не понятно: он изменил информацию на 0 или он не изменил её и поэтому 0? Если установить варчар, то более ясна ситуация визуально: если поле пустое, значит не менял, если 0 - значит менял.

Поэтому и интересуюсь, так как есть кое-какая причина задуматься над этом.

Если вы можете посоветовать мне использовать другой способ отслеживания изменения информации (факт изменения + на что изменил), я буду рад
  • Вопрос задан
  • 3658 просмотров
Решения вопроса 3
@VPank
Бессмертие ради знаний. Знания ради бессмертия.
Разница будет видна только в больших проектах. Так как VARCHAR занимает больше места. Но на маштабах малого проекта это никак не отразится. Но по правилам хорошего тона конечно же правильней использовать INT для чисел.

А насчет сравнения из-за которого вы паритесь. По поводу внесения 0 в INT то я вижу решение таковым. При отправки информации внесенной пользователем - добавляем произвольный символ в начало (к примеру "!") пользователь не изменил информацию = 0. Пользователь внес информацию в виде 0 получаем на выходе !0. Делаем проверку внес не внес. Если внес то отсекаем символ "!" и занасим значение в переменную.
Ответ написан
alex-saratov
@alex-saratov
У меня была несколько более сложная задача, по логированию изменений и подмен информации.
Решил так.
Для определения изменения использовал функцию crc32 ( доработанную под 64бит). Соединял все важные данные в одну строку получал значение crc32. Если это число уникально, то изменения были внесены. Изменения хранил одной строкой json_encode записи до изменения, по тем полям которые контролирую, в текстовом поле. таблица логов была помоему не сильно сложна id (INT), worker_id(INT), edit_id (INT), hash (INT)(UNIQUE), replased_data (TEXT).
Потребность данного действия появилась в момент когда "крысы" компании начали подменять телефоны и утаскивать клиента на себя и можно было понять кто и что поменял. Возможно не самое изящное решение, но оно выполнило свою задачу.
Ответ написан
Комментировать
streetflush
@streetflush
Как бы триггеры для этого есть
habrahabr.ru/post/37693
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AVKor
То, что в одном случае имеем дело с числом, а в другом - с текстом, это не приводит к самостоятельному ответу на вопрос?

Всё остальное по сравнению с этим вообще малозначащим можно считать.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы