
Каждый инженер, определяющий новый строковый столбец, решает: использовать ли nvarchar
или varchar?
С тех пор как я открыл для себя nvarchar
, я всегда использую nvarchar
. Моя мысль такова: зачем использовать тип данных, который может не поддерживать текстовое значение, и вы, скорее всего, не обнаружите несовместимое значение до тех пор, пока оно не окажется в продакшене.
Я слышу аргумент о месте, но место дешево и не стоит беспокойства. Я знаю, о чем вы думаете, стоимость не имеет значения, когда жесткий диск полон, и я согласен.
Начиная с 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 Compression implementation
2. What is the difference between varchar and nvarchar?
Автор: Чак Конвей специализируется на разработке программного обеспечения и генеративном ИИ. Свяжитесь с ним в социальных сетях: X (@chuckconway) или посетите его на YouTube.