Каков тип данных на национальном языке SQL (NCHAR)?

Как и CHAR (CHARACTER) и VARCHAR (CHARACTER VARYING), SQL предлагает тип NCHAR (NATIONAL CHARACTER) и NVARCHAR (NATIONAL CHARACTER VARYING). В некоторых базах данных это лучший тип данных для использования в символьных (не двоичных) строках:

  • В SQL Server NCHAR хранится как UTF-16LE и является единственным способом надежного хранения символов, отличных от ASCII, CHAR только однобайтовой кодовой страницы;

  • В Oracle NVARCHAR может храниться как UTF-16 или UTF-8, а не однобайтовое сопоставление;

  • Но в MySQL NVARCHAR есть VARCHAR, поэтому не имеет значения, любой тип может быть сохранен с помощью UTF-8 или любой другой сортировки.

Итак, что концептуально означает NATIONAL, если что-нибудь? В документах продавцов рассказывается только о том, какие символы используют собственные СУБД, а не о фактическом обосновании. Между тем стандарт SQL92 объясняет эту функцию еще менее благосклонно, заявляя только, что NATIONAL CHARACTER хранится в наборе символов, определенных реализацией. В отличие от простого CHARACTER, который хранится в определенном реализацией наборе символов. Каким может быть другой набор символов, определенный реализацией. Или нет.

Спасибо, ANSI. Thansi.

Следует ли использовать NVARCHAR для всех целей хранения символов (не двоичных)? Существуют ли в настоящее время популярные СУБД, в которых он будет делать что-то нежелательное или которые просто не распознают ключевое слово (или N'' литералы)?

Ответы

Ответ 1

"НАЦИОНАЛЬНЫЙ" в данном случае означает символы, характерные для разных национальностей. На дальневосточных языках особенно много персонажей, что одного байта недостаточно, чтобы отличить их всех. Поэтому, если у вас есть английское (ascii) -одно приложение или только английское поле, вы можете уйти, используя более старые типы CHAR и VARCHAR, которые допускают только один байт на символ.

Тем не менее, большую часть времени вы должны использовать NCHAR/NVARCHAR. Даже если вы не считаете, что вам необходимо поддерживать (или потенциально поддерживать) несколько языков в ваших данных, даже русскоязычные приложения должны иметь возможность разумно обрабатывать атаки с использованием символов иностранного языка.

По-моему, единственное место, где более старые типы CHAR/VARCHAR по-прежнему предпочтительны, - это часто используемые внутренние коды ascii и данные на таких платформах, как Sql Server, которые поддерживают различие — данных, которые были бы эквивалентны enum на языке клиента, таком как С++ или С#.

Ответ 2

В Oracle набор символов базы данных может быть многобайтным набором символов, поэтому вы можете хранить всевозможные символы там... но вам нужно понять и определить длину столбцов соответствующим образом (либо в BYTES или CHARACTERS).

NVARCHAR дает вам возможность иметь набор символов базы данных, который является однобайтным (что уменьшает вероятность путаницы между столбцами BYTE или CHARACTER) и использует NVARCHAR в качестве многобайтового. См. здесь.

Так как я преимущественно работаю с английскими данными, я бы использовал многобайтовый набор символов (в основном UTF-8) в качестве набора символов базы данных и игнорировал NVARCHAR. Если я унаследовал старую базу данных, которая была в однобайтовом наборе символов и была слишком большой для преобразования, я могу использовать NVARCHAR. Но я бы предпочел не делать этого.

Ответ 3

Между тем стандарт SQL92 объясняет функция еще менее услужливо, заявив только, что НАЦИОНАЛЬНЫЙ ХАРАКТЕР хранится в определенном реализацией набор символов. В отличие от простого ХАРАКТЕР, который хранится в набор символов, определенный реализацией. Что может быть другим набор символов, определенный реализацией. Или нет.

Кстати, это то же самое "различие", которое имеет стандарт С++ между char и wchar_t. Реликвия Темных Возрастов Кодировки символов, когда каждая комбинация языка/ОС имеет свой собственный набор символов.

Если использовать NVARCHAR для всех символьное (не двоичное) хранилище цели?

Не важно, является ли объявленный тип вашего столбца VARCHAR или NVARCHAR. Но для всех целей хранения символов важно использовать Unicode (UTF-8, UTF-16 или UTF-32).

Существуют ли в настоящее время популярные СУБД в что он сделает что-то нежелательное

Да. В MS SQL Server с помощью NCHAR ваши (английские) данные занимают в два раза больше места. К сожалению, UTF-8 еще не поддерживается.