В чем разница между char
, nchar
, ntext
, nvarchar
, text
и varchar
в SQL?Разница между различными типами строк в SQL Server?
Действительно ли есть приложение для каждого из этих типов, или некоторые из них просто устарели?
В чем разница между char
, nchar
, ntext
, nvarchar
, text
и varchar
в SQL?Разница между различными типами строк в SQL Server?
Действительно ли есть приложение для каждого из этих типов, или некоторые из них просто устарели?
text
и ntext
устарели, поэтому опускайте их на мгновение. Для того, что осталось, имеются 3 измерения:
N
перед именем обозначает Unicodevar
обозначает переменный, в противном случае фиксированного(max)
как длина обозначает BLOB, в противном случае это не- значение строкиТак с этим, вы можете прочитать значение любого типа в:
CHAR(10)
: это в двухрядный фиксированной длины, не Unicode размером 10NVARCHAR(256)
: это в-строки переменной длины Unicode, размером до-256VARCHAR(MAX)
: является переменной длины двоичных объектов не-UnicodeУстаревшей типы text
и ntext
соответствуют новым типам varchar(max)
и nvarchar(max)
соответственно.
Когда вы идете к деталям, смысл in-row
VS. BLOB
размывает при малых длинах как двигатель может оптимизировать хранение и тянуть BLOB в построчно или вытолкнуть значение построчно в «небольшой BLOB» блок распределения, но это всего лишь деталь реализации. См. Table and Index Organization.
С точки зрения программирования, все типы: CHAR
, VARCHAR
, NCHAR
, NVARCHAR
, VARCHAR(MAX)
и NVARCHAR(MAX)
, поддерживают равномерную строку API: String Functions. Старые, устаревшие типы TEXT
и NTEXT
do не поддерживают этот API, у них есть отдельный, отложенный, TEXT API для управления. Вы не должны использовать устаревшие типы.
BLOB-типы поддерживают эффективные обновления на месте с использованием синтаксиса UPDATE table SET column.WRITE(@value, @offset)
.
Разница между типами фиксированной длины и переменной длины исчезает при сжатии строк на столе. При включенном сжатии строк фиксированные длины и длина переменной сохраняются в одном формате, а конечные пробелы не сохраняются на диске, см. Row Compression Implementation. Обратите внимание, что сжатие страницы подразумевает сжатие строк.
Я знаю только между «char» и «varchar».
символ: он может выделить память определенного размера она заполняется ли не
VARCHAR: она выделяет память на основе количества символов в ней, но она должна иметь некоторый размер, называемый максимальный размер.
Дополнительно - текст и NTEXT устарели для VARCHAR (макс) и NVARCHAR (макс)
-1 от меня. пространство НЕ выделяется в блоках по 16 байт. Он занимает 16 байт в хранилище столбцов, но он распределяется по-разному. Остальное в порядке. – TomTom
@TomTom - Да, отредактировал мой ответ. –
Сохраняет ли varchar все одинаковые размеры для всех строк столбца? – Panzercrisis
н-префикс: юникода. var *: переменная длина, остальная часть - фиксированная длина.
Все типы данных правильно и красиво ... документированы.
Как здесь:
http://msdn.microsoft.com/en-us/library/ms187752.aspx
Есть ли действительно случай применение для каждого из этих типов, или некоторые из них просто устарела?
Нет, есть хороший случай для ЛЮБОГО из них.
Нет смысла использовать текст или текст. Он устарел, и поддержка будет удалена из будущих версий SQL-сервера. varchar (max) & nvarchar (max) следует использовать вместо этого. –
правый. http://msdn.microsoft.com/en-us/library/ms187993.aspx – bevacqua
Текст предназначен для очень большого количества текста и, как правило, не предназначен для поиска (но может быть в некоторых случаях. В любом случае он будет медленным).
Типы символов char/nchar имеют фиксированные длины и дополняются, если введенные данные короче, в отличие от типов varchar/nvarchar, которые являются переменной длиной.
n типов поддерживает юникод, где не-n типов нет.
text
и ntext
являются deprecated в пользу varchar(max)
и nvarchar(max)
N
префикс указывает на поддержку юникода и занимает в два раза больше байт на символ не-юникод.
Varchar
- переменная длина. Вы используете дополнительных 2 байта за поле для хранения длины.
Char
фиксированная длина. Если вы знаете, как долго будут ваши данные, используйте char
, так как вы будете сохранить байты!
Text
в основном не рекомендуется в моем опыте.
Осторожно использовать Varchar(max)
и NVarchar(max)
, так как эти поля не могут быть проиндексированы.
+1 для комментария индекса для varchar/nvarchar (max) –
Текст устарел.
Char - установленное значение. Когда вы говорите символ (10), вы резервируете 10 символов для каждой отдельной строки, независимо от того, используются они или нет. Используйте это для чего-то, что не должно изменять длину (например, почтовый индекс или SSN)
varchar является переменной. Когда вы говорите varchar (10), 2 байта зарезервированы для хранения размера данных, а также фактических данных (которые можно сказать только четыре байта).
N представляет собой уни-код. Дважды пространство.
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) обеспечивает ту же функциональность.
http://msdn.microsoft.com/en-us/library/aa258271(SQL.80).aspx – Stu