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

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

22 ответа

Решение

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

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

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

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

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

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

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

Здесь вы можете увидеть различия между varchar а также nvarchar,

Ссылка: SqlHints.com

Для получения дополнительной информации о Nvarchar и varchar см. Этот пост в блоге.

Это зависит от того, как был установлен 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! Это позволяет избежать ограничений и зависимостей, отлично подходит для хранения и, как правило, лучше всего подходит для производительности.

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

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

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

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

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

Перейти к VARCHAR в UTF8 теперь!

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

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

VARCHAR против NVARCHAR

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

VarcharРазмер данных переменной длины, отличных от символов Юникода, составляет до 8000. 1. Это тип данных переменной длины

  1. Используется для хранения не-Unicode символов

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

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

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

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

  1. Данные хранятся в кодировке Unicode. Каждый язык поддерживается. (например, языки арабский, немецкий, хинди и т. д. и т. д.)

Мои два цента

  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.

В основном nvarchar хранит символы Unicode, а varchar хранит символы не Unicode.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • не в Юникоде (char, varchar и текст)
  • Юникод (nchar, nvarchar и ntext)

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

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

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

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

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

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

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, если таковые имеются, в этих очень больших таблицы), поэтому, возможно, ожидаемые объемы строк данных становятся частью этого решения.

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

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

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

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

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

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

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

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

Кто-то заметил, что хранение/пространство в настоящее время не является проблемой. Даже если пространство не является проблемой для одного, определение оптимального типа данных должно быть требованием.

Дело не только в хранении! «Данные перемещаются», и вы видите, к чему я веду!

Другие вопросы по тегам