Это просто nvarchar
поддерживает многобайтовые символы? Если это так, есть ли смысл в использовании, кроме проблем хранения varchars
?
Это просто nvarchar
поддерживает многобайтовые символы? Если это так, есть ли смысл в использовании, кроме проблем хранения varchars
?
Ответы:
nvarchar
Столбец может хранить любые данные Unicode. varchar
Колонка ограничена 8-битной кодовой страницы. Некоторые люди думают, что это varchar
следует использовать, потому что это занимает меньше места. Я считаю, что это не правильный ответ. Несовместимость кодовых страниц - это боль, а Unicode - лекарство от проблем с кодовыми страницами. В наше время с дешевыми дисками и памятью, на самом деле больше нет причин тратить время на копирование кодовых страниц.
Все современные операционные системы и платформы разработки используют Unicode для внутреннего использования. Используя nvarchar
вместо varchar
, вы можете избежать преобразования кодировки каждый раз, когда читаете или записываете в базу данных. Преобразования занимают время и подвержены ошибкам. А восстановление после ошибок конвертации - нетривиальная проблема.
Если вы взаимодействуете с приложением, которое использует только ASCII, я все равно рекомендую использовать Unicode в базе данных. Алгоритмы сопоставления ОС и базы данных будут лучше работать с Unicode. Unicode позволяет избежать проблем конвертации при взаимодействии с другими системами. И вы будете готовиться к будущему. И вы всегда можете проверить, что ваши данные ограничены 7-битным ASCII для любой устаревшей системы, которую вы должны поддерживать, даже при этом наслаждаясь некоторыми преимуществами полного хранения Unicode.
varchar : переменная длина, не символьные данные Unicode. Сортировка базы данных определяет, на какой кодовой странице хранятся данные.
nvarchar : данные символов Unicode переменной длины. В зависимости от сопоставления базы данных для сравнения.
Вооружившись этими знаниями, используйте тот, который соответствует вашим входным данным (ASCII v. Unicode).
float
в int
и отправлять: «Ну, конечно, десятичные дроби пропадают». Просто не надо.
Я всегда использую nvarchar, поскольку он позволяет всему, что я собираю, выдерживать практически любые данные, которые я к нему добавляю. Моя система CMS делает китайский случайно, потому что я использовал nvarchar. В наши дни любые новые приложения не должны беспокоиться о количестве необходимого места.
"never"
, по крайней мере, технически.
Это зависит от того, как был установлен 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! Это позволяет избежать ограничений и зависимостей, отлично подходит для хранения и, как правило, лучше всего подходит для производительности.
Мои два цента
Индексы могут давать сбой, если не используются правильные типы данных:
В SQL Server: если у вас есть индекс по столбцу VARCHAR и вы указываете его в виде строки Unicode, SQL Server не использует этот индекс. То же самое происходит, когда вы представляете BigInt для индексированного столбца, содержащего SmallInt. Даже если BigInt достаточно мал, чтобы быть SmallInt, SQL Server не может использовать индекс. С другой стороны, у вас нет этой проблемы (при предоставлении SmallInt или Ansi-Code для индексированного столбца BigInt или NVARCHAR).
Типы данных могут различаться в разных СУБД (Система управления
базами данных): Знайте, что каждая база данных имеет немного разные типы данных, и 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
будет интернационализация (т.е. хранение строк в других языках).
Я бы сказал, это зависит.
Если вы разрабатываете настольное приложение, в котором ОС работает в Unicode (как и во всех современных системах Windows), а язык поддерживает Unicode (по умолчанию используются Unicode, как в Java или C #), тогда переходите к nvarchar.
Если вы разрабатываете веб-приложение, в котором строки представлены как UTF-8, а язык - это PHP, который все еще не поддерживает Unicode (в версиях 5.x), тогда varchar, вероятно, будет лучшим выбором.
Несмотря на то, что NVARCHAR
хранит Unicode, вы должны рассмотреть с помощью сопоставления также вы можете использовать VARCHAR
и сохранять свои данные на местных языках.
Просто представьте следующий сценарий.
Сортировка вашей базы данных - персидская, и вы сохраняете значение типа «علی» (персидское письмо Али) в VARCHAR(10)
типе данных. Проблем нет, и СУБД использует для хранения только три байта.
Однако, если вы хотите перенести свои данные в другую базу данных и увидеть правильный результат, ваша база данных назначения должна иметь такое же сопоставление, что и цель, которая в данном примере является персидской.
Если ваша целевая сортировка отличается, вы видите некоторые знаки вопроса (?) В целевой базе данных.
Наконец, помните, что если вы используете огромную базу данных, предназначенную для использования вашего местного языка, я бы рекомендовал использовать местоположение вместо использования слишком большого количества пробелов.
Я считаю, что дизайн может быть другим. Это зависит от среды, в которой вы работаете.
Я взглянул на ответы, и многие, кажется, рекомендуют использовать их nvarchar
заново varchar
, потому что пространство больше не является проблемой, поэтому нет ничего плохого в том, чтобы включить Unicode для небольшого дополнительного хранилища. Ну, это не всегда так, когда вы хотите применить индекс к вашему столбцу. SQL Server имеет ограничение в 900 байтов на размер поля, которое вы можете индексировать. Так что если у вас есть, varchar(900)
вы можете индексировать его, но нет varchar(901)
. С nvarchar
помощью количество символов уменьшается вдвое, так что вы можете индексировать до nvarchar(450)
. Так что, если вы уверены, что вам не нужно nvarchar
, я не рекомендую использовать его.
В целом, в базах данных я рекомендую придерживаться нужного размера, потому что вы всегда можете расширить. Например, коллега по работе однажды подумал, что использование nvarchar(max)
столбца не вредно, поскольку у нас вообще нет проблем с хранилищем. Позже, когда мы попытались применить индекс к этому столбцу, SQL Server отклонил это. Однако, если бы он начал с четного varchar(5)
, мы могли бы позже просто расширить его до того, что нам нужно, без такой проблемы, которая потребует от нас составления плана миграции на месте, чтобы решить эту проблему.
nVarchar поможет вам хранить символы Unicode. Это путь, если вы хотите хранить локализованные данные.
Если для хранения символа используется один байт, существует 256 возможных комбинаций, и, таким образом, вы можете сохранить 256 различных символов. Сортировка - это шаблон, который определяет символы и правила, по которым они сравниваются и сортируются.
1252, который является Latin1 (ANSI), является наиболее распространенным. Однобайтовые наборы символов также не подходят для хранения всех символов, используемых многими языками. Например, некоторые азиатские языки имеют тысячи символов, поэтому они должны использовать два байта на символ.
Когда в сети используются системы, использующие несколько кодовых страниц, становится сложно управлять связью. Чтобы стандартизировать вещи, консорциум ISO и Unicode представил Unicode . Unicode использует два байта для хранения каждого символа. Таким образом, можно определить 65 536 различных символов, поэтому почти все символы могут быть покрыты Unicode. Если два компьютера используют Unicode, каждый символ будет представлен одинаково и преобразование не требуется - это идея Unicode.
SQL Server имеет две категории типов символьных данных:
Если нам нужно сохранить символьные данные из нескольких стран, всегда используйте Unicode.
Я должен сказать здесь (я понимаю, что я, вероятно, собираюсь открыть себя для планки!), Но, безусловно, единственный раз, когда NVARCHAR
на самом деле более полезен (заметьте, что больше !), Чем VARCHAR
когда все сопоставления на всех зависимых систем и внутри самой базы данных одинаковы ...? Если нет, то преобразование сопоставления должно произойти в любом случае и делает его таким VARCHAR
же жизнеспособным, как и NVARCHAR
.
Чтобы добавить к этому, некоторые системы баз данных, такие как SQL Server (до 2012 года), имеют размер страницы ок. 8K. Таким образом, если вы хотите хранить данные для поиска, которые не хранятся в чем-то подобном поле TEXT
или, NTEXT
то вам VARCHAR
предоставляется пространство NVARCHAR
в 8 Кбайт, тогда как только 4 Кбайт (удваивает байты, удваивает пробел).
Подводя итог, я полагаю, что использование любого из них зависит от:
Следуйте разнице между Sql Server VARCHAR и типом данных NVARCHAR . Здесь вы можете увидеть очень наглядно.
В общем случае nvarchar хранит данные как Unicode, поэтому, если вы собираетесь хранить многоязычные данные (более одного языка) в столбце данных, вам нужен вариант N.
Основное различие между Varchar(n)
и nvarchar(n)
является:
Varchar
Размер данных переменной длины, отличных от символов Юникода, составляет до 8000. 1. Это тип данных переменной длины
Используется для хранения не-Unicode символов
Занимает 1 байт пространства для каждого символа
Nvarchar
: Символьные данные Unicode переменной длины.
1. Это тип данных переменной длины
2. Используется для хранения символов Юникода.
Джеффри Л Уитледж с оценкой репутации ~ 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
тем, чтобы сделать наш код без ошибок (несоответствие типов), потому что nvarchar
допускает также символы Юникода. Когда мы используем where
условие в запросе к SQL Server и если мы используем =
оператор, он несколько раз выдаст ошибку. Вероятная причина этого заключается в том, что наш столбец отображения будет отличаться varchar
. Если бы мы определили это в nvarchar
этой проблеме, то моей не случилось бы. Тем не менее, мы придерживаемся varchar
этой проблемы и избегаем ее, поэтому лучше использовать LIKE
ключевое слово, чем =
.