Целое число против строки в базе данных - PullRequest
23 голосов
/ 14 апреля 2009

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

Скажите, что я строю Пока что Другой Адрес Книга и есть поле для почтового индекса При условии, что почтовые индексы всегда 4-значное число, для какого типа данных я буду их хранить? Целое число или строка? Технически это целое число, но я не делаю никаких вычислений, я просто выкладываю его в таблицу. Изменится ли ваше мнение, если я хочу отсортировать таблицу по почтовому индексу?

Так вот, я не дура. Я признаю действительную потребность в целых числах, таких как просмотры страниц и уникальные пользователи или зарегистрированные пользователи и гостевые пользователи. Но как насчет хранения количества файлов в торренте? Целое число или строка?

Ответы [ 15 ]

37 голосов
/ 14 апреля 2009

В моей стране почтовые индексы также всегда состоят из 4 цифр. Но первая цифра может быть нулевой.

Если вы храните «0700» как целое число, вы можете получить много проблем:

  • Может читаться как восьмеричное значение
  • Если оно читается правильно как десятичное значение, оно превращается в «700»
  • Когда вы получите значение «700», вы должны не забыть добавить ноль
  • Если вы не добавите ноль, позже, как вы узнаете, если "700" - это "0700", или кто-то набрал "7100" неправильно?

Технически, наши почтовые индексы на самом деле являются строками, даже если это всегда 4 цифры.

Вы можете хранить их как целые числа, чтобы сэкономить место. Но помните, что это простой трюк с DB, и будьте осторожны с ведущими нулями.

Но как насчет хранения, сколько файлы есть в торренте? Целое число или строка

Это явно целое число.

28 голосов
/ 14 апреля 2009

Я всегда использую следующее правило:

Если вы планируете выполнять математические вычисления (добавлять / вычитать / и т. Д.), Сделайте его целочисленным или другим числовым типом данных.

Если вы не планируете выполнять какие-либо математические вычисления на поле, сохраните его в виде строки.

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

10 голосов
/ 14 апреля 2009

по моему мнению для почтовых индексов вы должны использовать строки, потому что у вас могут быть почтовые индексы с нулями (09100), и если вы используете целые числа, это будет 9100: сортировка не проблема, потому что есть еще алфавит заказ («09100» предшествует «09101»). Для хранения номеров файлов я бы ожидал целое число, поэтому у вас нет проблем с увеличением / уменьшением его номера. Таким образом, целое число против строки зависит от того, какое использование вы делаете!

9 голосов
/ 14 апреля 2009

Это вопрос семантики. Вы пытаетесь выбрать подходящий тип данных для хранения, что может быть сложным вопросом. Лучшее практическое правило - хранить ваши данные в виде целых чисел, если вам нужно будет использовать данные как целое число.

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

6 голосов
/ 14 апреля 2009

Что касается почтовых индексов, это типичный британский почтовый индекс:

EC2R 6PK

В университете мой лектор по базам данных сказал мне кое-что, что застряло со мной и все еще имеет место спустя 15 с лишним лет:

Если вы выполните арифметику, сохраните это как число. В противном случае это строка.

Честно говоря, я не думаю, что вы можете ошибиться с этим советом.

Очевидно, вы не выполняете арифметику для почтовых индексов, поэтому они являются строками.

5 голосов
/ 14 апреля 2009

Почтовый индекс - это не число: это код или идентификатор. То же самое относится и к телефонным номерам.

Количество файлов в торренте является целым числом.

Не в последнюю очередь, в этом случае вы можете создать CHECK CONSTRAINT LIKE '[09][09][09][09]' для поддержания правильности данных на уровне базы данных.

2 голосов
/ 14 апреля 2009

Является ли '0000' почтовым индексом? Отличается ли он от 0?

Если это всегда четырехзначное число, я всегда буду хранить его как 4 цифры, и это будет указывать на то, чтобы оно оставалось в виде строки.

2 голосов
/ 14 апреля 2009

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

Что касается количества файлов внутри торрента, это должно быть целое число.

1 голос
/ 14 апреля 2009

Также следует помнить, что не все почтовые индексы во всех странах являются только цифрами. То, что у вас сейчас нет адресов в Канаде, еще не значит, что у вас их не будет. Я всегда придерживался правила: если вы хотите выполнять математические вычисления, храните их в числовом виде, если это просто код (почтовые индексы, телефоны, SSN, номер участника и т. Д.), То я сохраняю его в виде строки. Чего вы хотите избежать, так это любого ненужного преобразования данных в другой формат каждый раз, когда вы вызываете его (например, код для добавления начальных нулей, если вы сохраняете почтовый индекс в виде числа или код для преобразования строки в число для вычислений). ). Это могут быть дорогостоящие операции, если вам нужно выполнять их многократно, особенно когда таблицы большие и в итоге вам нужно выполнить преобразование в предложении where. Гораздо лучше хранить данные так, как вам нужно.

1 голос
/ 14 апреля 2009

Я не использую числовой тип данных, если не собираюсь выполнять математические расчеты с данными. Зачем рисковать поиском проблемы в будущем для того, что вы «уверены», всегда будет числом, в которое кто-то решит вставить нечисловой символ.

Если вы не собираетесь заниматься математикой, сделайте это строкой.

...