0

Для чего действительно нужен SQL-тип данных национального символа (NCHAR)?

2

Заголовок: Проблема с использованием типов данных NCHAR и NVARCHAR в различных СУБД

Тело вопроса:

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

  1. В SQL Server NCHAR хранится в кодировке UTF-16LE и является единственным способом надежно сохранять не ASCII-символы, тогда как CHAR использует однобайтовую кодировку.
  2. В Oracle NVARCHAR может храниться в кодировках UTF-16 или UTF-8, а не в однобайтовой сортировке.
  3. Однако в MySQL тип NVARCHAR эквивалентен VARCHAR, поэтому разницы нет, и оба типа могут храниться с кодировкой UTF-8 или любой другой сортировкой.

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

Спасибо, ANSI.

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

1 ответ(ов)

0

В данном контексте "NATIONAL" обозначает символы, специфичные для разных национальностей. Особенно языки дальнего востока имеют такое количество символов, что одного байта недостаточно для их различения. Таким образом, если у вас есть приложение только на английском (ASCII) или поле, которое принимает только английский текст, вы можете использовать более старые типы CHAR и VARCHAR, которые позволяют использовать один байт на символ.

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

На мой взгляд, единственное место, где более старые типы CHAR/VARCHAR все еще предпочитаются, — это для часто используемых внутренних кодов и данных только на ASCII, на таких платформах, как SQL Server, которые поддерживают это различие. Такие данные будут эквивалентны enum в клиентских языках, таких как C++ или C#.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь