Поделиться через


nchar и nvarchar (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Azure Synapse Analytics AnalyticsPlatform System (PDW)

Символьные типы данных имеют фиксированный (nchar) или переменный (nvarchar) размер. В SQL Server 2012 (11.x) и более поздних версиях при использовании параметров сортировки дополнительных символов (SC) эти типы данных хранят полный диапазон символьных данных Юникода и используют кодировку символов UTF-16. Если указаны параметры сортировки без поддержки дополнительных символов, эти типы данных хранят только подмножество символьных данных, поддерживаемых кодировкой UCS-2.

Аргументы

nchar [ ( n ) ]

Строковые данные фиксированного размера. n определяет размер строки в парах байтов и должен быть значением от 1 до 4000. Размер хранилища — дважды n байт. В случае с кодировкой UCS-2 размер при хранении определяется как дважды n байт, а количество хранимых символов равно n. Для кодировки UTF-16 размер хранилища по-прежнему составляет два раза n байт, но количество символов, которые можно хранить, может быть меньше n, так как дополнительные символы используют две пары байтов (также называемые суррогатными парами). Синонимами типа nchar по стандарту ISO являются типы national char и national character.

nvarchar [ ( n | max ) ]

Строковые данные переменного размера. Значение n определяет размер строки в байтовых парах и может быть от 1 до 4000. Значение max указывает, что максимальный размер при хранении составляет 2^31-1 символов (2 ГБ). Размер при хранении определяется как дважды n байт + 2 байта. В случае с кодировкой UCS-2 размер при хранении определяется как дважды n байт + 2 байта, а количество хранимых символов равно n. Для кодировки UTF-16 размер хранилища по-прежнему составляет два раза n байт + 2 байта. Однако количество символов, которые могут храниться, может быть меньше n, так как дополнительные символы используют две пары байтов (также называемые суррогатными парами). Синонимами типа nvarchar по стандарту ISO являются типы national char varying и national character varying.

Замечания

Распространенное заблуждение заключается в том, чтобы думать, что с nchar(n) и nvarchar(n), n определяет количество символов. Однако в nchar(n) и nvarchar(n)n определяет длину строки в байтовых парах (0–4 000). n никогда не определяет количество хранимых символов. Эта концепция аналогична определению char и varchar.

Неправильное представление происходит, так как при использовании символов, определенных в диапазоне Юникода 0 до 65 535, один символ может храниться для каждой пары байтов. Однако в более высоких диапазонах Юникода (от 65 536 до 114 111) один символ может использовать две пары байтов. Например, в столбце, определенном как nchar(10), ядро СУБД может хранить 10 символов, использующих одну пару байтов (диапазон Юникода от 0 до 65 535), но менее 10 символов при использовании двух пар байтов (диапазон Юникода 65 536 до 114 111). Дополнительные сведения о хранении символов Юникода и их диапазонах см. в разделе Различия в хранении UTF-8 и UTF-16.

Если значение n в определении данных или инструкции объявления переменной не указано, длина по умолчанию равна 1. Когда n не указано функцией CAST, длина по умолчанию равна 30.

Если вы используете nchar или nvarchar, рекомендуется:

  • использовать nchar, если размеры записей данных в столбцах одинаковые;
  • использовать nvarchar, если размеры записей данных в столбцах существенно отличаются;
  • использовать nvarchar(max), если размеры записей данных в столбцах существенно отличаются и длина строки может превышать 4000 пар байтов.

sysname — это определяемый пользователем тип данных, который функционально эквивалентен nvarchar(128), за исключением того, что он не допускает значение NULL. Тип sysname используется для ссылки на имена объектов баз данных.

Объекты, использующие nchar или nvarchar , назначаются параметры сортировки по умолчанию базы данных, если только не назначено определенное параметры сортировки с помощью COLLATE предложения.

SET ANSI_PADDING всегда ON предназначен для nchar и nvarchar. SET ANSI_PADDING OFF не применяется к типам данных nchar или nvarchar .

Префикс констант строки символов Юникода с буквой N для сигнала входных данных UCS-2 или UTF-16 в зависимости от того, используется ли параметры сортировки SC. N Без префикса строка преобразуется в кодовую страницу по умолчанию базы данных, которая может не распознавать определенные символы. В SQL Server 2019 (15.x) и более поздних версиях при использовании параметров сортировки UTF-8 кодовая страница по умолчанию может хранить набор символов ЮникодА UTF-8.

При префиксе строковой константы с буквой Nнеявное преобразование приводит к строке UCS-2 или UTF-16, если константа для преобразования не превышает максимальную длину для типа данных строки nvarchar (4000). В противном случае неявное преобразование приводит к большому значению nvarchar(max).

Предупреждение

Каждому ненулевому столбцу varchar(max) и nvarchar(max) необходимо дополнительно выделить 24 байта памяти, которые учитываются в максимальном размере строки в 8060 байт во время операции сортировки. Эти дополнительные байты могут неявно ограничивать число ненулевых столбцов varchar(max) или nvarchar(max) в таблице. При создании таблицы или во время вставки данных не возникает особых ошибок (кроме обычного предупреждения о том, что максимальный размер строки превышает максимально допустимое значение в 8060 байт). Этот большой размер строки может вызвать ошибки (например, ошибка 512), которые пользователи могут не ожидать во время некоторых обычных операций. Примерами операций могут служить обновление ключа кластеризованного индекса или сортировка полного набора столбцов.

Преобразование символьных данных

Сведения о преобразовании символьных данных см. в разделе char и varchar. Дополнительные сведения о преобразовании между типами данных см. в разделе CAST и CONVERT.