Разница между различными типами строк в SQL Server?
В чем разница между char
, nchar
, ntext
, nvarchar
, text
и varchar
в SQL?
Действительно ли есть приложение для каждого из этих типов или некоторые из них просто устарели?
Ответы
Ответ 1
text
и ntext
устарели, поэтому опускайте их на мгновение. Для того, что осталось, есть 3 измерения:
- Unicode (UCS-2) и не-unicode:
N
перед именем обозначает Unicode
- Фиксированная длина против переменной длины:
var
обозначает переменную, в противном случае фиксированную
- В строке или BLOB:
(max)
как длина обозначает BLOB, в противном случае это значение в строке
Таким образом, вы можете прочитать любое значение типа:
-
CHAR(10)
: это фиксированная длина строки, не являющаяся Unicode размером 10
-
NVARCHAR(256)
: это строка переменной длины Unicode размером до 256
-
VARCHAR(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)
.
Разница между типами фиксированной длины и переменной длины исчезает при сжатии строк в таблице. С включенным сжатием строк фиксированные длины и длина переменной сохраняются в одном формате, а конечные пробелы не сохраняются на диске, см. Внедрение сжатия строк, Обратите внимание, что сжатие страницы подразумевает сжатие строк.
Ответ 2
- ' n "означает поддержку символов Unicode.
- char - указывает строку с фиксированной памятью. Пространство, выделенное с или без данных.
- varchar. Сохранение длины. Пространство выделяется столько же, сколько длина данных в столбце.
- текст. - Хранить огромные данные. Выделенное пространство составляет 16 байт для хранения столбцов.
Дополнительно - текст и ntext устарели для varchar (max) и nvarchar (max)
Ответ 3
text
и ntext
устарели в пользу varchar(max)
и nvarchar(max)
Ответ 4
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) обеспечивают ту же функциональность.
Ответ 5
N
префикс указывает поддержку unicode и занимает в два раза больше байтов на символ не-Юникода.
Varchar
- переменная длина. Для хранения длины используйте дополнительные 2 байта на поле.
Char
- фиксированная длина. Если вы знаете, как долго будут ваши данные, используйте Char
, поскольку вы будете сохранять байты!
Text
в большинстве случаев не рекомендуется.
Будьте осторожны с использованием Varchar(max)
и NVarchar(max)
, поскольку эти поля не могут быть проиндексированы.
Ответ 6
Я знаю только "char" и "varchar".
char: он может выделять память определенного размера независимо от того, заполняется ли она или нет.
varchar: он будет выделять память на основе количества символов в ней, но должен иметь некоторый размер, называемый максимальным размером.
Ответ 7
n-prefix: unicode.
var *: переменная длина, остальная часть - фиксированная длина.
Все типы данных правильно и красиво... документированы.
Как здесь:
http://msdn.microsoft.com/en-us/library/ms187752.aspx
Есть ли действительно приложение для каждого из этих типов, или некоторые из них из них просто устарели?
Нет, есть хороший случай для ЛЮБОГО из них.
Ответ 8
Текст предназначен для очень больших количеств текста и, как правило, не предназначен для поиска (но может быть в некоторых случаях. В любом случае он будет медленным).
Типы данных char/nchar имеют фиксированные длины и дополняются, если введенные данные короче, в отличие от типов varchar/nvarchar, которые являются переменной длиной.
n типов поддерживает юникод, где не-n типов нет.
Ответ 9
Текст устарел.
Char - заданное значение. Когда вы говорите char (10), вы резервируете 10 символов для каждой отдельной строки, независимо от того, используются они или нет. Используйте это для чего-то, что не должно изменять длины (например, почтовый индекс или SSN)
varchar является переменной. Когда вы говорите varchar (10), 2 байта зарезервированы для хранения размера данных, а также фактических данных (которые могут только сказать, четыре байта).
N представляет собой уни-код. Дважды пространство.