Чар против Варчар, когда не всегда заселен - PullRequest
1 голос
/ 03 июля 2010

У меня есть база данных с полем, в котором хранятся номера разрешений, связанные с запросами.Номера разрешений состоят из 13 цифр, но разрешение не может быть выдано.

С учетом вышесказанного, в настоящее время у меня есть поле, определенное как char (13), которое допускает NULL.Меня попросили изменить его на varchar (13), потому что char, если NULL, по-прежнему используют полную длину.

Желательно ли это?Кроме использования пространства, есть ли другие преимущества или недостатки в этом?

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

Ответы [ 4 ]

1 голос
/ 03 июля 2010

Если поле всегда должно быть ровно 13 символов, то я бы, вероятно, оставил его как CHAR (13).

Кроме того, интересное примечание от BOL:

ЕслиSET ANSI_PADDING имеет значение OFF, когда выполняется CREATE TABLE или ALTER TABLE, столбец char, определяемый как NULL, обрабатывается как varchar.

Edit : как часто вы ожидаетеполе должно быть NULL?Если он будет заполнен в 95% случаев, вряд ли стоит вносить эти изменения.

1 голос
/ 03 июля 2010

Что ж, если вам не нужно использовать столько места, вы можете разместить больше страниц в памяти. Если вы можете сделать это, то ваша система будет работать быстрее. Это может показаться тривиальным, но я недавно настроил типы данных в таблице на клиенте, что уменьшило количество операций чтения на 25%, а ЦП - примерно на 20%.

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

0 голосов
/ 03 июля 2010

если вы используете sql server 2008, вы должны посмотреть на сжатие строк и, возможно, разреженные поля, если столбец больше ~ 60% пустых значений.

Я бы оставил тип данных символом (13), если бы все заполненные поля использовали это количество.

Информация о сжатии строк: http://msdn.microsoft.com/en-us/library/cc280449.aspx

Разреженные столбцы: http://msdn.microsoft.com/en-us/library/cc280604.aspx

0 голосов
/ 03 июля 2010

Самое большое преимущество (в общем, не обязательно ваш конкретный случай), о котором я знаю, это то, что в коде, если вы используете varchar, вам не нужно использовать функцию Trim каждый раз, когда вы хотите, чтобы она отображалась. Я часто сталкиваюсь с этим, когда беру поля FirstName и LastName и объединяю их в полное имя. Это просто раздражает и делает код менее читабельным.

...