Разница между различными типами строк в SQL Server? - PullRequest
25 голосов
/ 15 ноября 2010

В чем разница между char, nchar, ntext, nvarchar, text и varchar в SQL?

Существует ли действительно прикладная программа для каждого из этихтипы, или некоторые из них просто устарели?

Ответы [ 9 ]

41 голосов
/ 15 ноября 2010

text и ntext устарели, поэтому давайте на мгновение опустим их. Для того, что осталось, есть 3 измерения:

  • Unicode (UCS-2) против не-Unicode: N перед именем обозначает Unicode
  • Фиксированная длина по сравнению с переменной длиной: var обозначает переменную, в противном случае фиксированная
  • In-row против BLOB: (max), поскольку длина обозначает BLOB, в противном случае это значение в строке

Итак, вы можете прочитать значение любого типа:

  • CHAR(10): это не-Unicode фиксированная длина строки 10
  • NVARCHAR(256): Юникод переменной длины в строке размером до 256
  • VARCHAR(MAX): BLOB-объект переменной длины, не поддерживающий Юникод

Устаревшие типы text и ntext соответствуют новым типам varchar(max) и nvarchar(max) соответственно.

Когда вы переходите к деталям, значение in-row против BLOB размывается для небольших длин, так как двигатель может оптимизировать хранилище и извлекать BLOB-строку в ряд или толкать в строке значение в единицу выделения «маленький BLOB», но это только деталь реализации. См. Организация таблиц и индексов .

С точки зрения программирования все типы: CHAR, VARCHAR, NCHAR, NVARCHAR, VARCHAR(MAX) и NVARCHAR(MAX), поддерживают API единой строки: Строковые функции . Старые устаревшие типы TEXT и NTEXT do not поддерживают этот API, у них есть отдельный, устаревший, TEXT API для манипулирования. Вы не должны использовать устаревшие типы.

Типы BLOB поддерживают эффективные обновления на месте с использованием синтаксиса UPDATE table SET column.WRITE(@value, @offset).

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

7 голосов
/ 15 ноября 2010
  • ' n ' представляет поддержку символов Юникода.
  • char - указывает строку с фиксированной длиной хранения. Пространство выделено с данными или без данных.
  • varchar - Хранение различной длины. Пространство выделяется как длина данных в столбце.
  • текст - для хранения огромных данных. Выделенное пространство для хранения столбцов составляет 16 байт.

Дополнительно - текст и ntext устарели для varchar (max) и nvarchar (max)

3 голосов
/ 15 ноября 2010

Префикс n просто означает Unicode. Эти «n» -типы работают аналогично обычным версиям, за исключением того, что они работают с текстом Unicode.

char - поле фиксированной длины. Таким образом, char (10), заполненный «Да», все равно будет занимать 10 байт памяти.

varchar - поле переменной длины. char (10), заполненный «Да», займет 5 байт памяти (для использования типов данных var требуется 2 байта).

char (n), содержащий строку длины x. Память = n байт. varchar (n) содержит строку длины x. Память = х + 2 байта.

vchar и nvarchar похожи, за исключением того, что это 2 байта на символ.

Вообще говоря, вы должны использовать только char & char (over varchar & nvarchar) при работе с фиксированными или полуфиксированными строками. Хорошим примером может служить product_code или user_type, длина которого всегда n символов.

Вы не должны использовать текст (или ntext), поскольку он устарел. varchar (max) и nvarchar (max) предоставляют те же функции.

3 голосов
/ 15 ноября 2010

text и ntext являются устаревшими в пользу varchar(max) и nvarchar(max)

2 голосов
/ 15 ноября 2010

N префикс указывает поддержку юникода и занимает в два раза больше байтов на символ не-юникода.

Varchar - переменная длина. Для хранения длины вы используете дополнительные 2 байта на поле .

Char - фиксированная длина. Если вы знаете, как долго будут храниться ваши данные, используйте char, а сохраните байты!

Text в большинстве случаев устарела в моем опыте.

Остерегайтесь использования Varchar(max) и NVarchar(max), так как эти поля не могут быть проиндексированы.

0 голосов
/ 15 ноября 2010

Текст устарел.

Char - это заданное значение. Когда вы говорите char (10), вы резервируете 10 символов для каждой строки, независимо от того, используются они или нет. Используйте это для чего-то, что не должно изменять длину (например, почтовый индекс или SSN)

varchar является переменной. Когда вы говорите varchar (10), для хранения размера данных, а также фактических данных (которые могут быть только четырьмя байтами) выделено 2 байта.

N представляет уни-код. Вдвое больше места.

0 голосов
/ 15 ноября 2010

Текст предназначен для очень больших объемов текста и, как правило, не предназначен для поиска (но может быть при некоторых обстоятельствах. В любом случае он будет медленным).

Типы данных char / nchar имеютфиксированные длины и дополняются, если введенный материал короче, в отличие от типов varchar / nvarchar, которые имеют переменную длину.

n-типы имеют поддержку юникода, а не-n-типы - нет.

0 голосов
/ 15 ноября 2010

n-префикс: юникод.var *: переменная длина, остальное - фиксированная длина.

Все типы данных правильно и красиво ... задокументированы.

Как здесь:

http://msdn.microsoft.com/en-us/library/ms187752.aspx

Существует ли действительно прикладная программа для каждого из этих типов, или некоторые из них просто устарели?

Нет, для ЛЮБОГО из них есть хороший пример.

0 голосов
/ 15 ноября 2010

Я знаю только между "char" и "varchar".

char: он может выделять память указанного размера независимо от того, заполнен он или нет

varchar: он выделяет память на основеколичество символов в нем, но оно должно иметь некоторый размер, называемый максимальным размером.

...