В чем разница между char
, nchar
, ntext
, nvarchar
, text
и varchar
в SQL?
Действительно ли есть приложение для каждого из этих типов или некоторые из них просто устарели?
В чем разница между char
, nchar
, ntext
, nvarchar
, text
и varchar
в SQL?
Действительно ли есть приложение для каждого из этих типов или некоторые из них просто устарели?
text
и ntext
устарели, поэтому опускайте их на мгновение. Для того, что осталось, есть 3 измерения:
N
перед именем обозначает Unicodevar
обозначает переменную, в противном случае фиксированную(max)
как длина обозначает BLOB, в противном случае это значение в строкеТаким образом, вы можете прочитать любое значение типа:
CHAR(10)
: это фиксированная длина строки, не являющаяся Unicode размером 10NVARCHAR(256)
: это строка переменной длины Unicode размером до 256VARCHAR(MAX)
: это переменная длина BLOB не-UnicodeУстаревшие типы text
и ntext
соответствуют новым типам VARCHAR(MAX)
и nvarchar(max)
соответственно.
Когда вы переходите к деталям, значение in-row
vs. BLOB
размывается для небольших длин, так как движок может оптимизировать хранилище и вытаскивать строку BLOB или вставлять значение строки в "маленький BLOB ', но это всего лишь деталь реализации. См. Таблица и индексная организация.
С точки зрения программирования все типы: CHAR
, VARCHAR
, NCHAR
, NVARCHAR
, VARCHAR(MAX)
и nvarchar(max)
поддерживают единую строку API: Строковые функции. Старые, устаревшие типы text
и ntext
не поддерживают этот API, у них есть отдельный, отложенный, TEXT API для управления. Вы не должны использовать устаревшие типы.
Типы BLOB поддерживают эффективные обновления на месте с помощью синтаксиса UPDATE table SET column.WRITE(@value, @offset)
.
Разница между типами фиксированной длины и переменной длины исчезает при сжатии строк в таблице. С включенным сжатием строк фиксированные длины и длина переменной сохраняются в одном формате, а конечные пробелы не сохраняются на диске, см. Внедрение сжатия строк, Обратите внимание, что сжатие страницы подразумевает сжатие строк.
Дополнительно - текст и ntext устарели для varchar (max) и nvarchar (max)
text
и ntext
устарели в пользу varchar(max)
и nvarchar(max)
n префикс просто означает Unicode. Они "n" работают аналогично обычным версиям, за исключением того, что они работают с текстом Unicode.
char - поле фиксированной длины. Таким образом, char (10), заполненный "Да", по-прежнему будет содержать 10 байт памяти.
varchar - это поле переменной длины. char (10), заполненный "Да", займет 5 байт памяти (для использования типов данных var используется 2 байта).
char (n), содержащая строку длины x. Хранение = n байтов. varchar (n), содержащая строку длины x. Хранение = x + 2 байта.
vchar и nvarchar похожи, за исключением двух байтов на символ.
Вообще говоря, вы должны использовать char и char (над varchar и nvarchar) при работе с фиксированными или полуфиксированными строками. Хорошим примером может быть product_code или user_type, который всегда содержит n символов.
Нельзя использовать текст (или ntext), поскольку он устарел. varchar (max) и nvarchar (max) обеспечивают ту же функциональность.
N
префикс указывает поддержку unicode и занимает в два раза больше байтов на символ не-Юникода.
Varchar
- переменная длина. Для хранения длины используйте дополнительные 2 байта на поле.
Char
- фиксированная длина. Если вы знаете, как долго будут ваши данные, используйте Char
, поскольку вы будете сохранять байты!
Text
в большинстве случаев не рекомендуется.
Будьте осторожны с использованием Varchar(max)
и NVarchar(max)
, поскольку эти поля не могут быть проиндексированы.
Я знаю только "char" и "varchar".
char: он может выделять память определенного размера независимо от того, заполняется ли она или нет.
varchar: он будет выделять память на основе количества символов в ней, но должен иметь некоторый размер, называемый максимальным размером.
n-prefix: unicode. var *: переменная длина, остальная часть - фиксированная длина.
Все типы данных правильно и красиво... документированы.
Как здесь:
http://msdn.microsoft.com/en-us/library/ms187752.aspx
Есть ли действительно приложение для каждого из этих типов, или некоторые из них из них просто устарели?
Нет, есть хороший случай для ЛЮБОГО из них.
Текст предназначен для очень больших количеств текста и, как правило, не предназначен для поиска (но может быть в некоторых случаях. В любом случае он будет медленным).
Типы данных char/nchar имеют фиксированные длины и дополняются, если введенные данные короче, в отличие от типов varchar/nvarchar, которые являются переменной длиной.
n типов поддерживает юникод, где не-n типов нет.
Текст устарел.
Char - заданное значение. Когда вы говорите char (10), вы резервируете 10 символов для каждой отдельной строки, независимо от того, используются они или нет. Используйте это для чего-то, что не должно изменять длины (например, почтовый индекс или SSN)
varchar является переменной. Когда вы говорите varchar (10), 2 байта зарезервированы для хранения размера данных, а также фактических данных (которые могут только сказать, четыре байта).
N представляет собой уни-код. Дважды пространство.