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)
.
Разница между типами фиксированной длины и переменной длины исчезает при сжатии строк в таблице. При включенном сжатии строк типы фиксированной длины и переменной длины сохраняются в одном и том же формате, а конечные пробелы не сохраняются на диске, см. Реализация сжатия строк . Обратите внимание, что сжатие страниц подразумевает сжатие строк.