Просто nvarchar
поддерживает многобайтовые символы? Если это так, то есть ли смысл использовать varchar
, кроме проблем с хранением?
В столбец типа nvarchar можно хранить любые данные в Юникоде. В
столбца varcharограничивается 8-битной кодовой страницы. Некоторые люди думают, что
типа varchar` следует использовать, потому что он занимает меньше места. Я считаю, что это не правильный ответ. Кодировка incompatabilities боль, и Юникод-это лекарство от проблем кодировки. С дешевых дисков и в наше время память, там действительно нет причин, чтобы тратить время больше приходится возиться с кодовыми страницами.
Все современные операционные системы и платформы для разработчиков, использующих Юникод внутренне. С помощью аргумент
, а не типа varchar
, вы можете избежать преобразования кодирования каждый раз, когда вы читать или записывать данные в базу данных. Преобразования требуют времени, и склонны к ошибкам. И восстановление от ошибок преобразования представляет собой нетривиальную проблему.
При взаимодействии с приложением, которое использует только символы ASCII, я бы все равно рекомендуем использовать Юникод в базе данных. Операционной системы и алгоритмы сортировки базы данных будет лучше работать с Unicode. Во избежание проблем преобразования Unicode при взаимодействии с другими систем. И вы будете готовиться к будущему. И вы всегда можете проверить, что ваши данные ограничены 7-битный ASCII для любой устаревшей системе вы'вновь приходится поддерживать, даже наслаждаясь некоторые преимущества полный Юникод хранения.
varchar: Символьные данные переменной длины, не относящиеся к Юникоду. Коллизия базы данных определяет, на какой кодовой странице хранятся данные.
nvarchar: Символьные данные Юникода переменной длины. Зависит от колляции базы данных для сравнения.
Вооружившись этими знаниями, используйте тот вариант, который соответствует вашим входным данным (ASCII против Unicode).
Я всегда использовать nvarchar, как он позволяет все, что я'м здания в значительной степени выдержит любую информацию я бросить на нее. Моя CMS систему не китайский случайно, потому что я использовать тип nvarchar. В эти дни, все новые приложения должны'т действительно волнует объем требуемого пространства.
Это зависит от того, как Oracle был установлен. Во время процесса установки, параметра NLS_CHARACTERSET устанавливается. Вы можете быть в состоянии найти его с выберите значение запрос $ из sys.реквизит$, где name = 'NLS_CHARACTERSET'
.
Если ваши NLS_CHARACTERSET кодировка Unicode, как UTF-8, то отлично. Использование типа varchar и nvarchar практически идентичны. Перестать читать прямо сейчас, просто пойти на это. В противном случае, или если у вас нет контроля над оракулом набор символов, Читать далее.
Тип varchar — данные хранятся в кодировке NLS_CHARACTERSET. Если есть другие экземпляры баз данных на одном сервере, вы можете быть ограничивается им; и наоборот, так как вы должны разделить параметр. Такое поле можно хранить любые данные, которые могут быть закодированы с помощью этого набора символов, и ничего другого. Так, например, если набор символов-МС-1252, вы можете только хранить символы как английские буквы, несколько букв с диакритическими знаками, и некоторые другие (например, € и —). Приложение будет полезно только в несколько районов, не работают нигде в мире. По этой причине, это считается плохой идеей.
Тип nvarchar — данные хранятся в кодировке Unicode. Каждый язык поддерживается. Хорошая Идея.
А что насчет пространства для хранения? Тип varchar обычно весьма эффективно, поскольку кодировка / кодировка была специально разработана для определенной локали. Тип nvarchar поля хранить в UTF-8 или UTF-16 кодировки, базы на НЛС настройки по иронии судьбы. UTF-8 является очень эффективным, что "Западное" и языков, при поддержке азиатских языков. В UTF-16 является очень эффективным для азиатских языков, в то же время поддерживая на "Западный" и языки. Если речь идет о памяти, выберите параметр NLS с причиной Oracle, чтобы использовать UTF-8 или UTF-16 соответственно.
Насчет скорости обработки? Большинство новых платформ кодирования использовать Юникод изначально (Ява, .Чистая, даже C++ с std::wstring, которая много лет назад!) так что если в поле базы данных имеет тип varchar это заставляет Oracle для преобразования между кодировками при каждом чтении или записи, не так хорошо. Использовать nvarchar избегает преобразования.
Итог: используйте nvarchar! Это позволяет избежать ограничений и зависимостей, хорошо для места для хранения, и, как правило, тоже лучше для производительности.
nvarchar хранит данные в формате Unicode, поэтому, если вы собираетесь хранить многоязычные данные (более одного языка) в колонке данных, вам нужен вариант N.
Мои два цента
Индексы могут потерпеть неудачу, если вы не используете правильные типы данных:<БР> В SQL&ампер;усилитель; nbsp;сервер: если у вас есть индекс по varchar столбец и представить его в строку в Юникоде, то SQL&ампер;усилитель; nbsp;сервер не использует индекс. То же самое происходит, когда вы представить bigint в индексированное-столбец, содержащий тип данных smallint. Даже если в bigint достаточно мал, чтобы быть в smallint, SQL и усилителя;усилитель; nbsp;сервер не может использовать индекс. Наоборот у вас нет этой проблемы (при оказании тип smallint или ANSI-код в индексный столбец bigint от типа nvarchar).
Типы данных могут различаться для разных СУБД'ы (система управления базами данных):<БР> Знаю, что каждая база данных имеет несколько различных типов и varchar не означает то же самое везде. Во время работы SQL&ампер;усилитель; nbsp;сервер имеет тип varchar и nvarchar, базе данных Apache/дерби только varchar, а там типа varchar в Юникод.
Главным образом тип сохраняет в Юникоде символов и тип varchar сохраняет в Юникоде символов.
"в Юникоды и" означает 16-битной схеме кодирования символов, позволяющий персонажей из множества других языков, таких как арабский, иврит, китайский, японский, должен быть закодирован в одном наборе символов.
Это означает, что юникоды использует 2 байта для хранения и nonunicodes использует только один байт на символ в магазине. Что означает юникоды нужна двойная емкость для хранения по сравнению с юникоды.
Я бы сказал, Это зависит.
При разработке настольных приложений, где ОС работает в Юникоде (как и все нынешние системы Windows) и язык не поддерживает Юникод (строки по умолчанию Юникод, как в Java или C#), а затем перейти тип nvarchar.
Если вы разрабатываете веб-приложение, где строки приходят в кодировке UTF-8, и язык PHP, который по-прежнему не поддерживает изначально в Юникоде (в версиях 5.X), то тип varchar, вероятно, будет лучшим выбором.
Вы'вновь правильно. аргумент
хранит данные в Юникоде, а типа varchar
один байт хранит символьные данные. Помимо различий хранение (аргумент
требуется вдвое больше пространства для хранения как тип varchar), о котором ты уже упоминал, главная причина предпочитая
аргументза
типа varchar будут интернационализации (т. е. хранение строк в других языках).
Хотя аргумент
магазинах Unicode, вы должны рассмотреть с помощью сортировки вы также можете использовать тип varchar и сохранить ваши данные местных языках.
Просто представьте себе следующую ситуацию.
Сопоставление твой труп перса и сохранить значение, как 'علی' (персидский писать Али) в тип varchar(10)` Тип данных. Нет никаких проблем и СУБД использует только три байта, чтобы сохранить его.
Однако, если вы хотите перенести данные в другую базу данных и увидеть правильный результат вашей целевой базе данных должны иметь одинаковые параметры сортировки целевой персидскому языку в этом примере.
Если ваша цель сортировки отличается, вы наблюдаете одни вопросительные знаки(?) в целевой базе данных.
Наконец, помните, если вы используете огромные базы данных для использования на вашем родном языке, я бы рекомендовал использовать место, вместо того, чтобы использовать слишком много пространства.
Я считаю, что дизайн может быть разным. Это зависит от окружающей среды вы работаете на.
Я посмотрел на ответы и, похоже, многие рекомендуют использовать аргумент
за типа varchar
, потому что пространство-это не проблема, так что нет никакого вреда в позволяя Unicode для немного дополнительной памяти. Ну, это не всегда верно, когда вы хотите применить индекс за вашу колонку. В SQL Server имеет ограничение в 900 байт на размер поля, можно индексировать. Так что если у вас есть типа varchar(900)
можно еще и проиндексировать, но не типа varchar(901)
. С аргумент
, количество символов, делится пополам, так что вы можете индекса до тип nvarchar(450). Поэтому если вы не уверены, что вы Дон'т нужна
аргумент`, я не'т рекомендуем использовать его.
В общем, в базах данных, я рекомендую придерживаться размер вам нужно, ведь вы всегда можете расширить. Например, коллега по работе когда-то думал, что нет никакого вреда в использовании тип nvarchar(Макс)для столбца, так как у нас нет никаких проблем с хранением вообще. Позже, когда мы пытались применить индекс на этот столбец, то SQL-сервер отверг это. Если, однако, он начал с еще
типа varchar(5), мы могли бы просто расширить ее впоследствии к тому, что нам нужна не такая проблема, которая потребует, чтобы мы сделали план в сфере миграции решить эту проблему.
Если один байт используется для хранения персонаж, есть 256 возможных комбинаций, и таким образом, вы можете сохранить 256 различных символов. Сортировки-это шаблон, который определяет символы и правила, по которым они сравниваются и сортируются.
1252, которая латинских типа 1 (анис), является наиболее распространенным. Однобайтовые наборы символов, также недостаточно, чтобы хранить все символы многих языков. Например, в некоторых азиатских языках есть тысячи символов, поэтому они должны использовать два байта на символ.
Стандартный ###Юникод
Для систем, использующих несколько страниц кода используются в сети, становится трудно управлять связи. Чтобы стандартизировать вещи, ISO и консорциум Unicode представил Юникод. Unicode использует два байта для хранения каждого символа. То есть 65536 различных символов может быть определен, так что почти все персонажи могут быть покрыты Юникод. Если два компьютера использовать Unicode, каждый символ будет представлен таким же образом, и никакого преобразования не требуется - эта идея лежит в основе Юникода.
В SQL Server Есть две категории символьные типы данных:
Если нужно сохранить данные персонажа из нескольких стран, всегда используйте Юникод.
Основное различие между `типа varchar(н) " и " тип nvarchar(н) - это:
Типа varchar
( переменной длины, данные не в Юникоде символов) размер до 8000.
1.Это тип данных с переменной длиной
Используется для хранения не-Unicode символы
Занимает 1 байт для каждого символа
Аргумент
:данные переменной длины символов Unicode.
1.Это тип данных переменной длины
2.Используется для хранения символов Unicode.
Следовать разница между SQL сервером и типа varchar тип данных nvarchar. Здесь вы могли видеть в очень описательно.
В generalnvarchar хранит данные в Юникоде, так что, если вы'ре собирается хранить данные на нескольких языках (более чем на одном языке) в столбец данных нужно Н вариант.
Я должен сказать здесь (я понимаю, что я'м, вероятно, собирается открыть себя до Шлихтинг!), но, конечно, единственный раз, когда аргумент
на самом деле другое полезные (обратите внимание на еще там!) чем типа varchar
- это когда все параметры сортировки на всех зависимых систем и в самой базе такие же...? Если нет, то преобразование параметров сортировки уже все равно случиться и так делает типа varchar
как жизнеспособный как аргумент
.
Чтобы добавить к этому, некоторые системы баз данных, такие как SQL сервер (до 2012 года)](http://support.microsoft.com/kb/2663912) размер страницы прибл. 8К. Так что, если вы'вновь глядя на хранение данные, которые не проходят в что-то типа текст
или типа ntext
поле Тип varchar
предоставляет полный 8К's стоит пространства а аргумент
только обеспечивает 4К (двойной байт, двойное пространство).
Я полагаю, обобщить, использовать либо зависит:
Джеффри л Whitledge с ~47000 репутации рекомендует использование тип nvarchar
Соломон Rutzky с ~33200 репутации рекомендует: не всегда использовать тип nvarchar. Это очень опасно, и часто дорогостоящие, отношение / подход.
https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4
Как человек такой высокой репутацией, что делает обучение разработчик баз данных SQL сервер выбрать?
Есть много предупреждений в ответы и комментарии о Проблемы с производительностью, если вы не последовательны в выборе.
Есть комментарии про/кон nvarchar для производительности.
Есть комментарии про/кон varchar для производительности.
У меня есть конкретное требование для таблицы со многими сотнями колонн, что само по себе является, наверное, необычно ?
Я'м выбор типа varchar, чтобы не ходить близко к 8060 байт-таблица размер лимита по SQL*сервер 2012.
Использовать тип nvarchar, для меня, выходит за этот предел 8060 байт.
Я'м думая, что я должен соответствовать типам данных из таблиц, связанных с Код для типа данных из основной центральный стол.
Я видел использование типа varchar столбец на это место работы, Южно-австралийское правительство, по предварительному опытные разработчики баз данных, где таблицы число строк будет несколько миллионов или более (и очень мало столбцы nvarchar, если таковые имеются, в этих очень больших таблиц), поэтому, возможно, ожидалось, данные по строке объемы и становится частью этого решения.
аргумент
является безопасным для пользования по сравнению с типа varchar
для того, чтобы освободить наши код ошибки (типа несовпадение) потому что аргумент
позволяет символов Юникода.
Когда мы используем " где " условие в запрос SQL Server и если мы с помощью оператора=
, он выдает ошибку несколько раз. Вероятная причина это наш сопоставления столбцов будут определяемых в тип varchar. Если мы определили его в
аргументэто мои проблемы не бывает. До сих пор мы придерживаемся
типа varcharи избежать этой проблемы, лучше использовать
какключевое слово, а не
=`.