Тип MySQL для хранения года: Smallint, Varchar или Date?

Я буду хранить год в таблице MySQL: лучше ли хранить это как smallint или varchar? Я полагаю, что, поскольку это не полная дата, формат даты не должен быть ответом, но я также включу это.

Смолинт? варчар (4)? Дата? что-то другое?

Примеры:

  • 2008

  • 1992

  • 2053


person Jeremy L    schedule 04.03.2009    source источник


Ответы (3)


Я бы использовал тип столбца YEAR(4)... но только если ожидаемые годы находятся в диапазоне от 1901 до 2155... в противном случае см. ответ Гамбринуса.

person Powerlord    schedule 04.03.2009
comment
Ну, я чувствую себя глупо из-за того, что полностью пропустил этот тип. Спасибо - person Jeremy L; 04.03.2009
comment
Это не широко используемый тип. Единственное преимущество, которое он имеет по сравнению с меньшими типами int, заключается в том, что вы можете использовать на нем функции даты. - person Powerlord; 04.03.2009
comment
Поскольку он имеет ширину всего один байт, он поддерживает только годы в диапазоне от «1901» до «2155». - person Paul Dixon; 04.03.2009
comment
@Paul: Это правда ... Я уже отметил это в своем ответе. - person Powerlord; 04.03.2009
comment
@Paul: я полагаю, что MySQL будет обновлен до этого, чтобы избежать ошибки Y2.155K - я надеюсь. Хорошая забота в любом случае. - person Jeremy L; 04.03.2009
comment
спасибо за упоминание типа данных year - не знал об этом - person Gambrinus; 04.03.2009
comment
Ага, спасибо за подсказку - я тоже о таком не слышала! - person nickf; 06.03.2009

Насколько я знаю, я бы выбрал small-int - varchar занял бы больше места, а также дату. второй вариант будет дата.

person Gambrinus    schedule 04.03.2009
comment
Не говоря уже о том, что small int будет сортироваться намного быстрее. - person The Thirsty Ape; 24.10.2013
comment
Для тех, кто использует Eloquent от Laravel (или Lumen), это кажется единственным вариантом. - person atwright147; 06.09.2015

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

Мое собственное эмпирическое правило заключается в том, чтобы учитывать, для чего используются данные. Если вы будете выполнять над ним математические операции, сохраните его как число. Если вы будете выполнять строковые функции (например, «Взять последние четыре символа SSN» или «Отображать номер телефона как (XXX) XXX-XXXX»), то это строка.

Дополнительным подсказкой является требование хранить ведущие нули как часть числа.

Кроме того, несмотря на то, что их обычно называют «номером телефона», они часто содержат буквы, указывающие на наличие добавочного номера в качестве суффикса. Точно так же стандартный номер книги потенциально может заканчиваться на «X» как на «контрольную цифру», а международный стандартный серийный номер может заканчиваться на «X» (несмотря на то, что Международный центр ISSN неоднократно называл его 8-значным кодом http://www.issn.org/understanding-the-issn/what-is-an-issn/).

Форматирование телефонных номеров в международном контексте, конечно, сложно, и для соответствия E.164 требуется, чтобы телефонные коды стран начинались с префикса «+».

person David Aldridge    schedule 06.03.2009
comment
Я с этим не согласен, номер телефона называется номером не просто так, он состоит только из цифр. То, как вы представляете число пользователю, не имеет отношения к тому, как вы сохраняете его в базе данных, которая должна содержать только данные, а не символы формата. - person Tim; 11.04.2017