Для чего действительно нужен SQL-тип данных национального символа (NCHAR)?
Заголовок: Проблема с использованием типов данных NCHAR и NVARCHAR в различных СУБД
Тело вопроса:
Я столкнулся с ситуацией, связанной с выбором типов данных для хранения строковых значений в SQL. Я заметил, что, помимо стандартных типов 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.
Следует ли использовать NVARCHAR
для всех целей хранения символьных (неконечных) данных? Есть ли СУБД, которые могут работать с этим типом не так, как ожидается, или которые просто не распознают это ключевое слово (или литералы вида N''
)?
1 ответ(ов)
В данном контексте "NATIONAL" обозначает символы, специфичные для разных национальностей. Особенно языки дальнего востока имеют такое количество символов, что одного байта недостаточно для их различения. Таким образом, если у вас есть приложение только на английском (ASCII) или поле, которое принимает только английский текст, вы можете использовать более старые типы CHAR и VARCHAR, которые позволяют использовать один байт на символ.
Тем не менее, в большинстве случаев лучше использовать NCHAR/NVARCHAR. Даже если вы не думаете, что вам нужно поддерживать (или потенциально поддерживать) несколько языков в ваших данных, даже приложения на английском языке должны уметь адекватно обрабатывать атаки безопасности с использованием символов на иностранных языках.
На мой взгляд, единственное место, где более старые типы CHAR/VARCHAR все еще предпочитаются, — это для часто используемых внутренних кодов и данных только на ASCII, на таких платформах, как SQL Server, которые поддерживают это различие. Такие данные будут эквивалентны enum
в клиентских языках, таких как C++ или C#.
Как выполнить UPDATE с использованием SELECT в SQL Server?
"Вставка результатов хранимой процедуры в временную таблицу"
Как экранировать одинарную кавычку в SQL Server?
Как выполнить оператор UPDATE с JOIN в SQL Server?
Возможно ли задать условия в Count()?