Каждый инженер, определяя новый столбец строк, решает: использовать ли 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.