Как мне хранить короткие текстовые строки в базе данных SQL Server?

StackOverflow https://stackoverflow.com/questions/54512

Вопрос

varchar(255), varchar(256), nvarchar(255), nvarchar(256), nvarchar(max) и т.д.?

256 кажется красивым, круглым и компактным числом.Но я видел, как 255 часто использовали.Почему?

В чем разница между varchar и nvarchar?

Это было полезно?

Решение

ВАРЧАР(255).Он не будет использовать все 255 символов памяти, а только ту память, которая вам нужна.Это 255, а не 256, потому что тогда у вас есть место для 255 плюс нулевой терминатор (или байт размера).

«N» означает Юникод.Используйте, если вы ожидаете символы, отличные от ASCII.

Другие советы

В MS SQL Server (7.0 и более поздних версиях) данные varchar представлены внутри тремя значениями:

  • Фактическая строка символов, длина которой будет от 0 до более 8000 байт (она зависит от размера страницы, других столбцов, хранящихся в строке, и некоторых других факторов).
  • Два байта используются для указания длины строки данных (которая дает значение от 0 до 8000+).
  • Если столбец допускает значение NULL, один бит в битовой маске NULL строки (таким образом, статус NULL для восьми столбцов, допускающих значение NULL, может быть представлен в одном байте).

Важной частью является двухбайтовый индикатор длины данных.Если бы это был один байт, вы могли бы правильно записывать только строки длиной от 0 до 255;с двумя байтами вы можете записывать строки длиной 0 до значения, превышающего 64000+ (в частности, 2^16 -1).Однако длина страницы SQL Server составляет 8 КБ, отсюда и ограничение в 8000+ символов.(В SQL 2005 есть возможность переполнения данных, но если ваши строки будут такими длинными, вам следует просто использовать varchar(max).)

Итак, независимо от того, как долго вы объявляете свой столбец типа данных varchar (15, 127, 511), на самом деле вы будете хранить для каждой строки:

  • 2 байта, чтобы указать длину строки
  • Фактическая строка, т.е.количество символов в этой строке

Это подводит меня к моей мысли:ряд старых систем использовали только 1 байт для хранения длины строки, и это ограничивало максимальную длину в 255 символов, что не так уж и долго.С двумя байтами у вас нет такого произвольного ограничения...поэтому я рекомендую выбрать число, которое имеет смысл для (предположительно нетехнически ориентированного) пользователя., мне нравится 50, 100, 250, 500 и даже 1000.Учитывая, что база памяти составляет более 8000 байт, 255 или 256 так же эффективны, как 200 или 250, и меньше эффективен, когда приходит время объяснять что-то конечным пользователям.

Это относится к однобайтовым данным (т.ансии, SQL_Latin1*_*General_CP1 и др.др.).Если вам нужно хранить данные для нескольких кодовых страниц или языков с использованием разных алфавитов, вам придется работать с типом данных nvarchar (который, я думаю, работает одинаково: два байта для количества символов, но для каждого фактического символа данных требуется два байт памяти).Если у вас есть строки, которые могут превышать 8000 или более 4000 в nvarchar, вам нужно будет использовать типы данных [n]varchar(max).

И если вы хотите знать, почему так важно занимать место дополнительными байтами только для того, чтобы отслеживать длину данных, посмотрите http://www.joelonsoftware.com/articles/fog0000000319.html

Филип

Есть еще несколько моментов, которые следует учитывать при определении char/varchar и вариантов N.

Во-первых, хранение строк переменной длины в базе данных требует некоторых затрат.Хорошее общее эмпирическое правило — использовать CHAR для строк длиной менее 10 символов, поскольку N/VARCHAR хранит как строку, так и длину, а также разницу между хранением короткий строки в N/CHAR илиN/VARCHAR меньше 10 не стоит затрат на длину строки.

Во-вторых, таблица на SQL-сервере хранится на страницах размером 8 КБ, поэтому максимальный размер строки данных составляет 8060 байт (остальные 192 используются SQL для служебных данных).Вот почему SQL допускает максимальное значение столбца VARCHAR(8000) и NVARCHAR(4000).Теперь ваша очередь может используйте VARCHAR(MAX) и версию Unicode.Но с этим могут быть связаны дополнительные накладные расходы.

Если я не ошибаюсь, SQL-сервер попытается сохранить данные на той же странице, что и остальная часть строки, но если вы попытаетесь поместить слишком много данных в столбец VARCHAR(Max), он будет рассматривать их как двоичные и сохраните его на другой странице.

Еще одно большое различие между CHAR и VARCHAR связано с разделением страниц.Учитывая, что SQL Server хранит данные на страницах размером 8 КБ, на странице может храниться любое количество строк данных.Если вы ОБНОВЛЯТЬ столбец VARCHAR со значением, достаточно большим, чтобы строка больше не помещалась на странице, сервер расколоть эту страницу, отойдя на некоторое количество записей.Если в базе данных нет доступных страниц и для базы данных установлено автоматическое увеличение, сервер сначала увеличит базу данных, чтобы выделить для нее пустые страницы, затем выделит пустые страницы для таблицы и, наконец, разделит одну страницу на две.

Если вы будете поддерживать другие языки, кроме английского, вам следует использовать nvarchar.

С HTML все в порядке, если он содержит стандартные символы ASCII.Я использовал nvarchar в основном в базах данных с многоязычной поддержкой.

Потому что есть 8 бит в 1 байте и поэтому в 1 байте вы можете хранить до 256 различных значений, что

0 1 2 3 4 5 ... 255

Обратите внимание, что первое число равно 0, так что в общей сложности это 256 цифры.

Итак, если вы используете nvarchar(255), он будет использовать 1 байт для хранения длины строки, но если вы опрокинетесь на 1 и используете nvarchar(256), вы потеряете еще 1 байт только за дополнительную скидку на 1 предмет с 255 (так как вам нужно 2 байта для хранения числа 256).

Возможно, это не фактическая реализация SQL-сервера, но я считаю, что это типичная причина ограничения количества элементов 255 вместо 256.

и нварчар предназначен для Unicode, который использует более 2 байтов на символ и
варчар предназначен для обычного текста ASCII, который использует только 1 байт.

IIRC, 255 — это максимальный размер varchar в MySQL до того, как вам пришлось переключиться на текстовый тип данных или был в какой-то момент (на самом деле, я думаю, что сейчас он больше).Так что сохранение значения 255 может обеспечить вам некоторую совместимость.Однако вам следует просмотреть это, прежде чем действовать.

varchar против nvarchar — это что-то вроде ascii против unicode.varchar ограничен одним байтом на символ, nvarchar может использовать два.Вот почему у вас может быть varchar(8000), но только nvarchar(4000).

И varchar, и nvarchar автоматически подбирают размер в соответствии с содержимым, но число, которое вы определяете при объявлении типа столбца, является максимальным.

Значения в «nvarchar» занимают в два раза больше места на диске/памяти, чем «varchar», поскольку Юникод двухбайтовый, но когда вы объявляете тип столбца, вы объявляете количество символов, а не байтов.

Поэтому, когда вы определяете тип столбца, вы должны определить максимальное количество символов, которое когда-либо понадобится столбцу, и указать его в качестве размера varchar (или nvarchar).

Хорошее практическое правило — оценить максимальную длину строки, которую должен содержать столбец, а затем добавить к нему поддержку примерно на 10 % больше символов, чтобы избежать проблем с неожиданно длинными данными в будущем.

varchar(255) также был максимальной длиной в SQL Server 7.0 и более ранних версиях.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top