Skip to content

Посты

NVarchar против Varchar

5 августа 2020 г. • 2 мин чтения

NVarchar против Varchar

Каждый инженер, определяя новый столбец строк, решает: использовать ли nvarchar или varchar?

С тех пор как я открыл для себя nvarchar, я всегда использую nvarchar. Моя логика такова: зачем использовать тип данных, который может не поддерживать текстовое значение, и вы, вероятно, не обнаружите несовместимость до того, как это попадёт в production.

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

Начиная с SQL Server 2008 R2, сжатие данных применяется к полям nchar и nvarchar (nvarchar(max) исключён). Эффективность сжатия зависит от данных, но для английского языка достигается 50% сжатие, что ставит его на один уровень с потребностями в пространстве varchar (1).

Ещё один момент, который стоит рассмотреть: большинство языков программирования поддерживают UTF-16 как тип строк. Поэтому каждый раз, когда varchar загружается из базы данных, он преобразуется в UTF-16 (nvarchar-подобный)

Этот ответ на StackOverflow суммирует nvarchar против varchar:

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

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

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

Мой вывод: единственный раз, когда данные — это varchar, это когда они находятся в состоянии покоя.

Ссылки:

1. Реализация сжатия Unicode
2. В чём разница между varchar и nvarchar?

Автор: Chuck Conway — инженер AI с почти 30-летним опытом разработки программного обеспечения. Он создает практические системы AI — конвейеры контента, агенты инфраструктуры и инструменты, которые решают реальные проблемы — и делится тем, что он узнает на этом пути. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube и на SubStack.

↑ Вернуться в начало

Вам также может понравиться