Каковы варианты использования для выбора CHAR над VARCHAR в SQL? - PullRequest
267 голосов
/ 12 сентября 2008

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

Ответы [ 19 ]

3 голосов
/ 05 ноября 2008

Многие люди отмечают, что если вы знаете точную длину значения, использование CHAR имеет некоторые преимущества. Но несмотря на то, что сохранение штатов США в качестве CHAR (2) сегодня прекрасно, когда вы получаете сообщение от продаж, что «Мы только что сделали нашу первую продажу в Австралию», вы находитесь в мире боли. Я всегда посылаю, чтобы переоценить, как долго, я думаю, поля должны быть, а не делать «точное» предположение, чтобы покрыть будущие события. VARCHAR даст мне больше гибкости в этой области.

2 голосов
/ 13 апреля 2018

Я бы никогда не использовал символы. У меня были эти дебаты со многими людьми, и они всегда поднимают усталое клише, что чарс быстрее. Ну, я говорю, насколько быстрее? О чем мы здесь говорим, миллисекундах, секундах и если да, то сколько? Вы говорите мне, потому что кто-то утверждает, что это на несколько миллисекунд быстрее, мы должны ввести в систему тонны трудно исправляемых ошибок?

Итак, вот некоторые проблемы, с которыми вы столкнетесь:

Каждое поле будет дополнено, так что вы всегда будете иметь код, который везде имеет RTRIMS. Это также огромная трата дискового пространства для более длинных полей.

Теперь предположим, что у вас есть типичный пример поля char, состоящего всего из одного символа, но поле является необязательным. Если кто-то передает пустую строку в это поле, он становится одним пробелом. Поэтому, когда другое приложение / процесс запрашивает его, они получают один пробел, если они не используют rtrim. У нас были XML-документы, файлы и другие программы, которые отображают только один пробел в необязательных полях и что-то не так.

Итак, теперь вы должны убедиться, что вы передаете пустые строки, а не пустые, в поле char. Но это НЕ правильное использование нуля. Вот использование нуля. Допустим, вы получили файл от поставщика

Имя | Пол | Город

Боб || Лос-Анджелес

Если пол не указан, то вы вводите Боба, пустую строку и Лос-Анджелес в таблицу. Теперь предположим, что вы получили файл, его формат изменился, и пол больше не включен, но был в прошлом.

Имя | Город

Боб | Сиэтл

Ну, так как пол не включен, я бы использовал нуль. Varchars поддерживают это без проблем.

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

Я мог бы продолжать и исправлять все ошибки, которые мне пришлось исправить с помощью символов и примерно через 20 лет разработки.

2 голосов
/ 25 октября 2013

фрагментация. Char резервирует пространство, а VarChar - нет. Разделение страниц может потребоваться для обновления varchar.

2 голосов
/ 18 сентября 2008

Я думаю, что в вашем случае, вероятно, нет причин не выбирать Varchar. Это дает вам гибкость, и, как уже упоминалось рядом респондентов, производительность теперь такова, что за исключением очень специфических обстоятельств, мы, простые смертные (в отличие от администраторов Google), не заметим разницы.

Интересно отметить, что, когда речь заходит о типах БД, sqlite (популярная мини-база данных с довольно впечатляющей производительностью) помещает все в базу данных в виде строки и печатает на лету.

Я всегда использую VarChar и обычно делаю его намного больше, чем мне может понадобиться. Например. 50 для имени, как вы говорите, почему бы не просто быть в безопасности.

2 голосов
/ 14 сентября 2008

Классический компромисс между производительностью и производительностью.

В MS SQL 2005 Varchar (или NVarchar для языков, требующих два байта на символ, т.е. китайский), имеют переменную длину. Если вы добавите в строку после того, как она будет записана на жесткий диск, она найдет данные в неконкурентном месте в исходной строке и приведет к фрагментации ваших файлов данных. Это повлияет на производительность.

Итак, если пространство не является проблемой, то Char лучше для производительности, но если вы хотите уменьшить размер базы данных, тогда varchars лучше.

2 голосов
/ 12 сентября 2008

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

1 голос
/ 12 сентября 2008

при использовании значений varchar SQL Server требуются дополнительные 2 байта на строку для хранения некоторой информации об этом столбце, тогда как если вы используете char, это не нужно так что если вы

0 голосов
/ 25 ноября 2014

Использование CHAR (NCHAR) и VARCHAR (NVARCHAR) приводит к различиям в способах хранения данных сервером базы данных. Первый вводит конечные пробелы; Я столкнулся с проблемой при использовании его с оператором LIKE в функциях SQL SERVER. Поэтому я должен обеспечить безопасность, постоянно используя VARCHAR (NVARCHAR).

Например, если у нас есть таблица TEST (ID INT, Status CHAR (1)) , и вы пишете функцию для вывода списка всех записей с некоторым конкретным значением, например, следующим:

CREATE FUNCTION List(@Status AS CHAR(1) = '')
RETURNS TABLE
AS
RETURN
SELECT * FROM TEST
WHERE Status LIKE '%' + @Status '%'

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

0 голосов
/ 12 сентября 2008

В некоторых базах данных SQL VARCHAR будет дополнен до максимального размера, чтобы оптимизировать смещения, чтобы ускорить полное сканирование таблиц и индексов.

Из-за этого у вас нет экономии места при использовании VARCHAR (200) по сравнению с CHAR (200)

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