В чем разница между varchar и nvarchar?

Просто nvarchar поддерживает многобайтовые символы? Если это так, то есть ли смысл, кроме проблем с хранением, использовать varchars?


person stimms    schedule 27.09.2008    source источник
comment
Мне нравится точка зрения Инкудро, именно это в первую очередь заставило меня покопаться в разнице между varchar и nvarchar. Наше приложение Java для базы данных SQL Server использует myBatis, который по умолчанию отправляет строки как nvarchar (до сих пор не знаю, как (или если) это можно переопределить). Простой запрос представлял собой огромную проблему с производительностью, потому что я определил столбец, который он выбирал, как varchar, а не nvarchar, и он игнорировал индекс этого столбца.   -  person Sean Read    schedule 02.05.2013


Ответы (20)


Столбец nvarchar может хранить любые данные Unicode. Столбец varchar ограничен 8-битной кодовой страницей. Некоторые думают, что нужно использовать varchar, потому что он занимает меньше места. Я считаю, что это неправильный ответ. Несовместимость кодовых страниц - это боль, а Unicode - лекарство от проблем с кодовыми страницами. С дешевыми дисками и памятью в настоящее время действительно нет причин тратить время на возню с кодовыми страницами.

Все современные операционные системы и платформы разработки внутренне используют Unicode. Используя nvarchar вместо varchar, вы можете избежать преобразования кодировки каждый раз при чтении или записи в базу данных. Преобразования требуют времени и подвержены ошибкам. А восстановление после ошибок конвертации - задача нетривиальная.

Если вы взаимодействуете с приложением, которое использует только ASCII, я все равно рекомендую использовать Unicode в базе данных. Алгоритмы сортировки ОС и базы данных будут лучше работать с Unicode. Unicode позволяет избежать проблем с преобразованием при взаимодействии с другими системами. И вы будете готовиться к будущему. И вы всегда можете проверить, что ваши данные ограничены 7-битным ASCII для любой устаревшей системы, которую вы должны поддерживать, даже при этом пользуясь некоторыми преимуществами полного хранилища Unicode.

person Jeffrey L Whitledge    schedule 29.09.2008
comment
Это отличная информация. Итак, правильно ли я понимаю это, если сделаю вывод, что выбор в конечном итоге становится одним из - какой ресурс дешевле: процессор + накладные расходы на разработку или хранилище? - person Matt Cashatt; 15.01.2012
comment
@MatthewPatrickCashatt - Вы могли видеть это так. Но если вы представите великолепный мир, в котором все текстовые данные находятся в Unicode, а разработчикам просто не нужно думать о том, в какой кодировке что-то находится, а целый класс ошибок просто никогда не возникает, тогда вы увидите, что выбора действительно нет. - person Jeffrey L Whitledge; 18.01.2012
comment
@Martin Smith - в этих случаях исчезает крошечное преимущество varchar (компактное хранилище). Думаю, варчар даже хуже, чем я думал! - person Jeffrey L Whitledge; 06.02.2012
comment
@JeffreyLWhitledge: Комментарий №1: Как вы думаете, ваш ответ все еще актуален для целей хранилища данных? В документе на этой странице предлагается "Only use nchar and nvarchar when the universe of values spans or will span multiple languages.". Для целей хранилища данных не следует ли также принимать во внимание дисковый ввод-вывод и пропускную способность сети? - person Adrian Torrie; 10.05.2013
comment
@JeffreyLWhitledge: Комментарий №2: Если вы думаете с точки зрения (ссылка) "With 1 billion rows, every wasted byte per row costs you 1GB, which you also have to backup, recover, and index." Считаете ли вы несовместимость кодовых страниц определяющим фактором при выборе / выборе типа данных? - person Adrian Torrie; 10.05.2013
comment
@iValueValue - Значит, они защищают кодовые страницы как средство сжатия данных? Если бы мне пришлось сжимать данные, я бы хотел сделать это таким образом, чтобы не нарушать целостность этих данных. Есть много способов сделать это, не искажая ваши символьные данные, как это было бы искажено при преобразовании кодовой страницы. UTF-8 будет хорошим началом. - person Jeffrey L Whitledge; 10.05.2013
comment
@iValueValue - Кроме того, дизайн хранилища данных в целом не заботится о случайных 1 ГБ, потраченных здесь и там. Типичная звездообразная схема спроектирована так, чтобы тратить тонны пространства на денормализацию данных. Я не поклонник таких схем, поскольку они представляют собой неправильное использование совершенно хорошей системы РСУБД. Но, если предположить, что это хорошая идея, после того как вы решили отказаться от хорошей реляционной базы данных для хранилища данных, наличие сильно несжатых данных вряд ли станет проблемой, о которой стоит беспокоиться. - person Jeffrey L Whitledge; 10.05.2013
comment
Имейте в виду, что после того, как вы решили хранить свои данные в формате Unicode, все еще остается вопрос, какое представление Unicode лучше всего. Строки nvarchar обычно используются в кодировке UTF-16, поэтому основное преимущество, которое он имеет перед UTF-8, заключается в том, что он упрощает взаимодействие с другими компонентами, использующими UTF-16 (например, системные вызовы Windows или 16-битное сопоставление). На самом деле это не Unicode, более или менее, чем UTF-8 на самом деле unicode, хотя он все же превосходит ASCII. И помимо сжатия английского текста, преимущество UTF-8 такое же, как у UTF-16: взаимодействие с другими компонентами UTF-8 ... - person Steve Jessop; 07.06.2013
comment
Столбец nvarchar может хранить любые данные Unicode. Это неправда, хотя такое впечатление легко получить из большей части документации MSSQL. Используемая внутри кодировка - UCS-2, которая может хранить только данные в базовой многоязычной плоскости Unicode. Символы вне этой плоскости не могут быть сохранены непосредственно в поле nchar или nvarchar без дополнительной обработки. - person PeterAllenWebb; 27.06.2013
comment
@PeterAllenWebb - Вы можете «хранить» любые данные Unicode, потому что суррогатные пары в UTF-16 могут храниться в UCS-2, как если бы они были символами. Это будет работать прозрачно для хранения и поиска данных. Что вы не можете сделать, так это получить надежные преобразования наблюдений и сравнения вне BMP, но я не делал никаких заявлений по этому поводу. Поэтому, если у вас есть много текста Desseret, который вы хотите обработать, было бы лучше сделать это за пределами базы данных. Но его там вполне можно хранить. (Конечно, и здесь varchar вам не поможет!) - person Jeffrey L Whitledge; 27.06.2013
comment
В чем разница между Ascii (символ) и Ascii (строка) ?? .Sql обрабатывает все значения как двоичные или двоичные ??? - person sarathkumar; 04.07.2014
comment
С производительностью я вижу прямо противоположное. Чтение 2k nvarchars примерно на треть медленнее, чем чтение 2k varchars. Я использую SSD, чтобы минимизировать ввод-вывод. Таким образом, преобразование происходит намного быстрее, чем ввод-вывод, что, на мой взгляд, имеет смысл, поскольку преобразование не зависит от ввода-вывода, а ввод-вывод всегда будет самой медленной частью всего этого. - person Paw Baltzersen; 07.07.2014
comment
@PawBaltzersen - Мне это кажется правильным. Ясно, что чтение 400 000 байт займет больше времени, чем чтение 200 000 байт. Тот факт, что версия nvarchar не заняла в два раза больше времени, может частично объясняться дополнительным временем, необходимым для преобразования кодовой страницы. Однако мой аргумент заключается не в том, что Unicode быстрее. Я считаю, что это правильно. И для меня каждый раз быстро исправляйте козыри. - person Jeffrey L Whitledge; 07.07.2014
comment
Там, где я работаю, у нас есть 12000 баз данных, каждая из которых содержит миллионы строк. Эти базы данных работают только в США и Великобритании. Было бы нелепо тратить те деньги, о которых вы говорите, на хранилище из-за несуществующей правильности. У нас никогда не было ничего неправильного. - person PRMan; 10.10.2014
comment
@PRMan - вы не говорите, какие данные хранятся в ваших базах данных, но если они включают людей или названия мест, то простой факт, что ни одна (не-Unicode) кодовая страница не покрывает все символы, необходимые для данных. чтобы быть правильным. Это верно даже для США или Великобритании. Когда вы говорите, что у вас никогда ничего не было, неправильно, мне интересно, откуда вы это знаете. Вы хотите сказать, что система никогда не выходила из строя из-за ошибки кодирования? Я приму это. Вы хотите сказать, что никто никогда не жаловался на то, что система искажает их имя? Я тоже приму это. - person Jeffrey L Whitledge; 10.10.2014
comment
(продолжение) Вы хотите сказать, что никто никогда не отказывался от попыток ввести свое имя правильно и просто соглашался с произошедшим искажением? Возможно, этого не произошло. Но если это так, то у вас нет возможности узнать. Я утверждаю, что вы, вероятно, не знаете, какие ошибки вкрались в вашу базу данных. Машины продолжают гудеть, так что с данными все в порядке. Бьюсь об заклад, вы читаете свою печатную газету при свете лампы накаливания, и все это тоже отлично работает. - person Jeffrey L Whitledge; 10.10.2014
comment
Какие примеры вы можете нам предложить, Джеффри? В моей части мира (Скандинавия) самая большая проблема обычно заключается в выборе правильного сопоставления (чтобы получить æ / ä, ø / ö, å в правильном порядке). Варчар отлично хранит наши специальные символы (хотя и в виде двух байтов). Поскольку ~ 90-95% символов обычно представляют собой простые символы ascii, это означает, что почти 50% символьных полей хранят нули, если мы используем nvarchar. Там, где я работаю, мы действительно перешли на nvarchar, и первый вопрос от наших hw-парней был: почему теперь dbs в два раза больше обычного размера ?. Я подозреваю, что наш ход был ошибкой, и я хотел бы узнать иначе. - person 9Rune5; 09.08.2015
comment
Просто чтобы ответить на мой собственный комментарий: выбранная мной сортировка не поддерживает UTF-8. Я привык работать с СУБД (SQL Anywhere), которая использует UTF-8 и, естественно, запускает разные стратегии, когда дело касается NVARCHAR и VARCHAR. Таким образом: NVARCHAR для меня. - person 9Rune5; 16.10.2015
comment
Правильно ли я считаю, что, как правило, для данных следует использовать nvarchar, тогда как при индексировании будут использоваться varchar и char для создания отношений, поскольку они могут обеспечить дополнительную производительность, которая имеет большое значение? - person jwrightmail; 23.02.2018
comment
@jwrightmail В некоторой степени возможно, что на производительность приложений такого типа может повлиять выбор одного или другого набора символов, и также возможно (но не уверенно), что улучшение будет благоприятствовать набору символов varchar. Но я все равно не стал бы этого делать. В основном потому, что (как показано в этом ответе) у меня, похоже, есть религиозная преданность Unicode и автоматическое мнение, что все наборы символов, отличные от Unicode, являются злом. Если вы не разделяете мою религию, тогда доступны другие варианты, но я могу тайно судить вас за это. Извините. - person Jeffrey L Whitledge; 26.02.2018

varchar: переменной длины, без Символьные данные Unicode. Параметры сортировки базы данных определяют, на какой кодовой странице хранятся данные.

nvarchar: символьные данные Unicode переменной длины . Зависит от параметров сортировки базы данных для сравнений.

Вооружившись этими знаниями, используйте тот, который соответствует вашим входным данным (ASCII v. Unicode).

person user7116    schedule 27.09.2008
comment
Есть ли ограничение, например, что varchar не может хранить данные Unicode? Это все единицы и нули. Я могу сохранить китайский контент как varchar в моей БД. Я просто указываю его UTF-8. Как тогда это работает? - person Nishant; 24.09.2014
comment
@Nishant late answer: конечно, вы можете хранить UTF-8 в varchar, но это нарушит строковые функции SQL Server. Если вы выполняете все поиски / преобразования в своем приложении, тогда да, вы можете это сделать (но в чем польза?). Только кодировка Unicode, поддерживаемая SS, - это UCS-2 (да, не UTF-16 до SS2k16), и его строковые функции работают только с этой кодировкой. Кстати, как насчет индексов? Если вы хотите хранить произвольные данные, вам лучше использовать двоичный код. - person Adriano Repetti; 09.09.2015
comment
Да, это просто нарушает функции поиска строк. - person Nishant; 11.09.2015
comment
Итак, вы знаете ... это не работает. Это все равно, что сохранить float в int и сделать так, чтобы десятичные дроби пропали. Только не надо. - person user7116; 11.09.2015

Я всегда использую nvarchar, так как он позволяет всему, что я создаю, противостоять практически любым данным, которые я ему передаю. Моя система CMS делает китайский случайно, потому что я использовал nvarchar. В наши дни любые новые приложения не должны беспокоиться о размере необходимого места.

person tags2k    schedule 27.09.2008
comment
Идея о том, что новые приложения не должны быть связаны с ограничениями пространства, в некоторой степени недальновидна, и любой, кто имел дело с базами данных на уровне среднего и крупного предприятия, будет счастлив сказать вам, что это совершенно неверно. - person Frater; 21.07.2010
comment
Чтобы позволить себе вставить слова в рот tags2k, я думаю, что более точное утверждение могло бы быть таким: «Все более маловероятно, что какие-либо новые приложения должны больше заботиться о требуемом пространстве, чем о интернационализации и других проблемах с набором символов». - person Cowan; 16.10.2010
comment
В наши дни любые новые приложения не должны беспокоиться о количестве необходимого места. - Если вы не используете бесплатное облачное хранилище, где платный план - это ЗНАЧИТЕЛЬНЫЙ скачок в долларах (см. Общие планы AppHarbor SQL Server). - person ganders; 06.06.2014
comment
@ganders Howl! Вы правы. Обобщенные утверждения верны в лучшем случае только временно. Вычислительная техника - определенно игра качелей и окольных путей. Меня определенно беспокоит, сколько места я использую в Windows Azure CCP. Тем не менее, я бы никогда не стал использовать varchar вместо nvarchar. Ооо, я только что противоречил себе? - person rism; 08.06.2014
comment
@rism, я считаю, что вы устранили любой риск противоречия с использованием цитат на "never", по крайней мере, технически. - person Smandoli; 05.11.2014

Это зависит от того, как был установлен Oracle. В процессе установки устанавливается параметр NLS_CHARACTERSET. Вы можете найти его с помощью запроса SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'.

Если ваш NLS_CHARACTERSET является кодировкой Unicode, такой как UTF8, отлично. Использование VARCHAR и NVARCHAR в значительной степени идентичны. Прекратите читать сейчас, просто дерзайте. В противном случае или если у вас нет контроля над набором символов Oracle, читайте дальше.

VARCHAR - данные хранятся в кодировке NLS_CHARACTERSET. Если на том же сервере есть другие экземпляры базы данных, вы можете быть ограничены ими; и наоборот, так как вам нужно поделиться настройкой. В таком поле могут храниться любые данные, которые можно закодировать с использованием этого набора символов, и ничего больше. Так, например, если набор символов - MS-1252, вы можете хранить только такие символы, как английские буквы, несколько букв с диакритическими знаками и некоторые другие (например, € и -). Ваше приложение будет полезно только для нескольких регионов и не сможет работать где-либо еще в мире. По этой причине это считается плохой идеей.

NVARCHAR - данные хранятся в кодировке Unicode. Поддерживаются все языки. Хорошая идея.

А как насчет места для хранения? VARCHAR обычно эффективен, поскольку набор символов / кодировка были специально разработаны для конкретной локали. Поля NVARCHAR хранятся либо в кодировке UTF-8, либо в UTF-16, что, по иронии судьбы, основано на настройке NLS. UTF-8 очень эффективен для «западных» языков, но при этом поддерживает азиатские языки. UTF-16 очень эффективен для азиатских языков, но при этом поддерживает «западные» языки. Если вас беспокоит пространство для хранения, выберите параметр NLS, чтобы Oracle использовал UTF-8 или UTF-16 в зависимости от ситуации.

А как насчет скорости обработки? Большинство новых платформ кодирования изначально используют Unicode (Java, .NET, даже C ++ std :: wstring много лет назад!), Поэтому, если поле базы данных - VARCHAR, это заставляет Oracle преобразовывать между наборами символов при каждом чтении или записи, что не так хорошо. Использование NVARCHAR позволяет избежать преобразования.

Итог: используйте NVARCHAR! Он позволяет избежать ограничений и зависимостей, подходит для хранения и, как правило, лучше всего подходит для производительности.

person Jeremy Frank    schedule 07.10.2010
comment
Это действительно хороший ответ, за исключением того, что речь идет о sql-сервере. - person stimms; 08.10.2010

nvarchar хранит данные как Unicode, поэтому, если вы собираетесь хранить многоязычные данные (более одного языка) в столбце данных, вам нужен вариант N.

person albertein    schedule 27.09.2008

Мои два цента

  1. Индексы могут давать сбой, если не используются правильные типы данных:
    В SQL Server: когда у вас есть индекс по столбцу VARCHAR и он представляет собой строку Unicode, SQL Server не использует этот индекс. То же самое происходит, когда вы представляете BigInt индексированному столбцу, содержащему SmallInt. Даже если BigInt достаточно мал, чтобы быть SmallInt, SQL Server не может использовать индекс. В противном случае у вас нет этой проблемы (при предоставлении SmallInt или Ansi-Code для индексированного столбца BigInt или NVARCHAR).

  2. Типы данных могут различаться в зависимости от СУБД (системы управления базами данных):
    Знайте, что каждая база данных имеет несколько разные типы данных, и VARCHAR не везде означает одно и то же. В то время как SQL Server имеет VARCHAR и NVARCHAR, база данных Apache / Derby имеет только VARCHAR, а VARCHAR находится в Unicode.

person incomudro    schedule 19.04.2013
comment
Но, конечно, если вы правильно пишете свой код (т.е. используете параметризованные запросы и т.д.), то точка 1 представляет меньший риск. - person Paul; 20.11.2013

В основном nvarchar хранит символы Юникода, а varchar - символы не Юникода.

«Юникоды» означает 16-битную схему кодирования символов, позволяющую кодировать символы из множества других языков, таких как арабский, иврит, китайский, японский, в одном наборе символов.

Это означает, что unicodes использует 2 байта на символ для хранения, а nonunicodes использует только один байт на символ для хранения. Это означает, что для юникодов требуется двойная емкость для хранения по сравнению с не-юникодами.

person ranjit pawar    schedule 14.12.2011

Ты прав. nvarchar хранит данные Unicode, а varchar хранит однобайтовые символьные данные. Помимо различий в хранении (для nvarchar требуется вдвое больше места для хранения, чем для varchar), о чем вы уже упоминали, основной причиной предпочтения nvarchar перед varchar будет интернационализация (т. Е. Хранение строк на других языках).

person Mike Spross    schedule 27.09.2008

Я бы сказал, это зависит от обстоятельств.

Если вы разрабатываете настольное приложение, в котором ОС работает в Unicode (как и все текущие системы Windows), а язык изначально поддерживает Unicode (строки по умолчанию - Unicode, например, в Java или C #), тогда используйте nvarchar.

Если вы разрабатываете веб-приложение, в котором строки представлены как UTF-8, а языком является PHP, который по-прежнему не поддерживает Unicode изначально (в версиях 5.x), то varchar, вероятно, будет лучшим выбором.

person sleepy012    schedule 25.01.2010

Хотя NVARCHAR хранит Unicode, вы должны учитывать, что с помощью сопоставления вы также можете использовать VARCHAR и сохранять данные на ваших местных языках.

Представьте себе следующий сценарий.

Сопоставление вашей БД - персидское, и вы сохраняете такое значение, как «علی» (персидское написание Али) в типе данных VARCHAR(10). Проблем нет, и СУБД использует только три байта для его хранения.

Однако, если вы хотите перенести свои данные в другую базу данных и увидеть правильный результат, ваша целевая база данных должна иметь то же сопоставление, что и целевая, которая в этом примере является персидской.

Если ваше целевое сопоставление отличается, вы увидите несколько вопросительных знаков (?) В целевой базе данных.

Наконец, помните, что если вы используете огромную базу данных, предназначенную для использования на вашем местном языке, я бы рекомендовал использовать местоположение вместо использования слишком большого количества пробелов.

Я считаю, что дизайн может быть разным. Это зависит от среды, в которой вы работаете.

person Ali Elmi    schedule 15.02.2016

nVarchar поможет вам хранить символы Unicode. Это лучший вариант, если вы хотите хранить локализованные данные.

person Vijesh VP    schedule 27.09.2008

Я просмотрел ответы, и многие, кажется, рекомендуют использовать nvarchar вместо varchar, потому что пространство больше не является проблемой, поэтому нет ничего плохого в том, чтобы включить Unicode для небольшого дополнительного хранилища. Что ж, это не всегда верно, если вы хотите применить индекс к своему столбцу. SQL Server имеет ограничение на размер индексируемого поля в 900 байт. Так что, если у вас есть varchar(900), вы все равно можете его проиндексировать, но не varchar(901). С nvarchar количество символов уменьшается вдвое, поэтому вы можете индексировать до nvarchar(450). Так что, если вы уверены, что nvarchar вам не нужен, я не рекомендую его использовать.

В общем, в базах данных я рекомендую придерживаться нужного вам размера, потому что вы всегда можете расширить его. Например, коллега по работе однажды подумал, что нет ничего плохого в использовании nvarchar(max) для столбца, поскольку у нас вообще нет проблем с хранением. Позже, когда мы попытались применить индекс к этому столбцу, SQL Server отклонил это. Если, однако, он начал даже с varchar(5), мы могли бы просто расширить его позже до того, что нам нужно, без такой проблемы, которая потребовала бы от нас составления плана миграции на местах для решения этой проблемы.

person Rafid    schedule 05.01.2017

Основное различие между Varchar(n) и nvarchar(n):  введите описание изображения здесь

Размер Varchar (символьные данные переменной длины, не в формате Unicode) - до 8000. 1. Это тип данных переменной длины.

  1. Используется для хранения символов, отличных от Юникода

  2. Занимает 1 байт для каждого символа

введите описание изображения здесь

Nvarchar: символьные данные Unicode переменной длины.

1. это тип данных переменной длины.

2. Используется для хранения символов Юникода.

  1. Данные хранятся в кодировке Unicode. Поддерживаются все языки. (например, языки арабский, немецкий, хинди и т. д. и т. д.)
person Debendra Dash    schedule 14.05.2017

Если для хранения символа используется один байт, существует 256 возможных комбинаций, и, таким образом, вы можете сохранить 256 различных символов. Сопоставление - это шаблон, который определяет символы и правила, по которым они сравниваются и сортируются.

1252, то есть Latin1 (ANSI), является наиболее распространенным. Однобайтовые наборы символов также недостаточны для хранения всех символов, используемых во многих языках. Например, некоторые азиатские языки содержат тысячи символов, поэтому они должны использовать два байта на символ.

Стандарт Юникода

Когда в сети используются системы, использующие несколько кодовых страниц, становится трудно управлять связью. Для стандартизации консорциум ISO и Unicode представил Unicode. Юникод использует два байта для хранения каждого символа. То есть можно определить 65 536 различных символов, поэтому почти все символы могут быть покрыты Unicode. Если два компьютера используют Unicode, все символы будут представлены одинаково и преобразование не потребуется - это идея Unicode.

В SQL Server есть две категории символьных типов данных:

  • не-Unicode (char, varchar и text)
  • Юникод (nchar, nvarchar и ntext)

Если нам нужно сохранить символьные данные из нескольких стран, всегда используйте Unicode.

person Jithin Shaji    schedule 04.06.2014

Я должен сказать здесь (я понимаю, что, вероятно, собираюсь открыть себя для рекламы!), Но, безусловно, это единственный раз, когда NVARCHAR действительно более полезен (обратите внимание на more < / em> там!) чем VARCHAR, когда все параметры сортировки во всех зависимых системах и в самой базе данных одинаковы ...? В противном случае преобразование сопоставления должно произойти в любом случае, что делает VARCHAR столь же жизнеспособным, как NVARCHAR.

Чтобы добавить к этому, некоторые системы баз данных, такие как SQL Server (до 2012 г.), имеют размер страницы ок. 8К. Итак, если вы хотите сохранить данные с возможностью поиска, не содержащиеся в чем-то вроде поля TEXT или NTEXT, тогда VARCHAR предоставляет все 8 КБ пространства, тогда как NVARCHAR предоставляет только 4 КБ (удвоить байты, удвоить пространство).

Подводя итог, я полагаю, что использование любого из них зависит от:

  • Проект или контекст
  • Инфраструктура
  • Система баз данных
person Paul    schedule 20.11.2013

Следуйте Разница между типом данных VARCHAR и NVARCHAR сервера Sql. Здесь вы могли видеть очень наглядно.

Обычно nvarchar хранит данные как Unicode, поэтому, если вы собираетесь хранить многоязычные данные (более одного языка) в столбце данных, вам нужен вариант N.

person Pradeep Kesharwani    schedule 29.01.2014
comment
Это очень полезная ссылка, но ваш ответ не более того: ссылка. - person RubberDuck; 07.10.2014
comment
ckuhn203, я не скажу вам видеть это - person Pradeep Kesharwani; 08.10.2014

Джеффри Л. Уитледж с ~ 47000 баллом репутации рекомендует использовать nvarchar

Соломон Рутцки с оценкой репутации ~ 33200 рекомендует: НЕ всегда использовать NVARCHAR. Это очень опасный и часто дорогостоящий подход / подход.

Каковы основные различия в производительности между varchar и типы данных nvarchar SQL Server?

https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4

Оба человека с такой высокой репутацией, что выбирает обучающийся разработчик базы данных sql server?

В ответах и ​​комментариях есть много предупреждений о проблемах с производительностью, если вы не последовательны в выборе.

Есть комментарии pro / con nvarchar для производительности.

Есть комментарии pro / con varchar по производительности.

У меня есть особые требования к таблице со многими сотнями столбцов, что само по себе, вероятно, необычно?

Я выбираю varchar, чтобы не приближаться к пределу размера записи таблицы в 8060 байт для SQL * server 2012.

Использование nvarchar для меня превышает этот предел в 8060 байт.

Я также думаю, что мне следует сопоставить типы данных связанных таблиц кода с типами данных основной центральной таблицы.

Я видел использование столбца varchar на этом месте работы, в правительстве Южной Австралии, предыдущими опытными разработчиками баз данных, где количество строк таблицы будет несколько миллионов или более (и очень мало столбцов nvarchar, если таковые имеются, в этих очень больших таблицы), поэтому, возможно, ожидаемые объемы строк данных станут частью этого решения.

person Allan F    schedule 09.04.2019

varchar используется только для non-Unicode characters, с другой стороны nvarchar используется как для unicode, так и для non-unicode символов. Некоторые другие различия между ними приведены ниже.

VARCHAR против NVARCHAR

VARCHAR NVARCHAR
Character Data Type Variable-length, non-Unicode characters Variable-length, both Unicode and non-Unicode characters such as Japanese, Korean, and Chinese.
Maximum Length Up to 8,000 characters Up to 4,000 characters
Character Size Takes up 1 byte per character Takes up 2 bytes per Unicode/Non-Unicode character
Storage Size Actual Length (in bytes) 2 times Actual Length (in bytes)
Usage Used when data length is variable or variable length columns and if actual data is always way less than capacity Due to storage only, used only if you need Unicode support such as the Japanese Kanji or Korean Hangul characters.
person Amar Anondo    schedule 01.03.2021

Поскольку SQL Столбцы varchar Server 2019 поддерживают кодировку UTF-8.

Таким образом, отныне разница в размере.

В системе баз данных это означает разницу в скорости.

Меньший размер = меньше операций ввода-вывода + меньше памяти = больше скорости в целом. Прочтите статью выше, чтобы узнать цифры.

С этого момента переходите на varchar в UTF8!

Только если у вас есть большой процент данных с символами в диапазоне 2048–16383 и 16384–65535, вам придется измерить

person Alexander Bartosh    schedule 05.10.2020

nvarchar безопасно использовать по сравнению с varchar, чтобы наш код не содержал ошибок (несоответствие типов), потому что nvarchar также допускает символы Юникода. Когда мы используем условие where в запросе SQL Server, и если мы используем оператор =, он будет вызывать ошибку несколько раз. Вероятная причина этого в том, что наш столбец сопоставления будет обозначен в varchar. Если мы определили это в nvarchar, этой проблемы не будет. Тем не менее, мы придерживаемся varchar и, чтобы избежать этой проблемы, лучше использовать ключевое слово LIKE, а не =.

person Rinoy Ashokan    schedule 10.08.2017
comment
разница между like и = - это поддержка varchar и nvarchar - person yolob 21; 18.11.2020