NVarChar в MS SQL

Ваш отзыв

varchar nvarchar

Представим на минуточку, что у Вас уже есть некая база данных MS SQL, в которой есть набор уже заполненных таблиц какими-то Вашими данными. Также предположим, что у Вас в одной из таблиц есть колонка OrgName, куда записываются наименования компаний. Все идет как по маслу, данные изо дня в день пишутся, никаких проблем не наблюдается. Среди компаний попадаются как российские, так и зарубежные. И вот в один прекрасный день Вы заводите компанию и вместо ее названия, например, «ТОО «Темір жол күзет»» видите «ТОО «Темір жол к?зет». Что это?!

Чтобы понять, чем состоит проблема, необходимо выяснить, какого типа данные хранятся в указанной колонке OrgName. Если тип данных nvarchar, стало быть дело в коде, который обращается к базе данных, чтобы записать информацию и об этом ниже, если же varchar — то причина именно  этом.

Отличие varchar от nvarchar

Главное отличие varchar от nvarchar состоит в том, что nvarchar хранит данные переменной длины в формате Unicode, тогда как varchar — в кодировке, ассоциированной с заданным Сollation.

Collation — это шаблон, который определяет правила отображения, сравнения и сортировки для различных символьных кодировок.

Например, если задан Collation Latin1_General, то символы будут отображаться в кодировке Windows-1251. Если используется nvarchar, то связывания Collation с конкретной кодировкой не происходит, т.к. используется Unicode, там это явно лишнее.

Как правило, Collation остается заданным по умолчанию для всего сервера MS SQL. Узнать его значение в этом случае можно, выполнив запрос

Если есть сомнения в том, что Collation какого-то конкретного столбца не был изменен, лучше узнать Collation для него самого. Тут команда чуть длиннее:

, где MyBase — имя Вашей базы данных, MyTableName — имя таблицы, где содержится столбец, ColumnName — имя столбца, для которого выясняем Collation.

В результате одного из этих запросов вернется что-то вроде

Это мой результат запроса, т.к. сервер MS SQL устанавливался на «русскую» Windows. Исходя из этого и таблицы, которую можно получить, выполнив запрос

, можно понять, в какой кодировке отобразятся наши символы, если используется тип varchar.

Если в названии организаций используются только русские и латинские буквы, то varchar вполне хватит. А если присутствуют какие-то другие символы, то тут без nvarchar не обойтись.

Следует иметь ввиду, что при сохранении строки в Unicode, на один символ расходуется 2 байта памяти, тогда как при использовании varchar на символ уходит 1 байт + overhead 2 байта на сохраненную строку.

Проблема при записи информации в таблицу

Даже если у столбца таблицы задан тип данных nvarchar, результат записи данных все равно может выглядеть как «ТОО «Темір жол к?зет». Не стоит забывать про то, что запись может инициироваться в хранимых процедурах или из кода программы.

Если запись информации инициируется из кода программы, то надо убедиться, что параметр, значение которого необходимо записать в таблицу, также имеет тип nvarchar, а не varchar. Пример задания значения параметра из C#:

То же касается и хранимых процедур, запросов. Для этого можно использовать литерал N перед значением. Например:

Общая рекомендация такова: если предполагается наличие данных на языках, алфавит которых может содержать символы, описываемые только в Unicode, то необходимо задавать тип данных nvarchar. Это убережет от дальнейших проблем.

Если поменять тип данных с varchar на nvarchar, убедиться, что в коде и везде, где надо, указывается юникодная строка, то компания с названием  «ТОО «Темір жол күзет»» наконец-то будет нормально записана в БД  .


Оставьте комментарий

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url=""> <img src="" alt="" class="" width="" height="">

http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ab.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ac.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ag.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ah.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ai.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ak.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/am.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/an.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ao.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aq.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ar.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/at.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/av.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/aw.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/ay.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/az.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bb.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bc.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/bd.gif 
http://noservice.ru/wp-content/plugins/wp-monalisa/icons/be.gif 
больше...