Есть ли недостаток, чтобы положить N перед строками в скриптах? Это считается "лучшей практикой"?

Скажем, у меня есть таблица с полем varchar. Если я сделаю такую ​​вставку:

INSERT MyTable 
 SELECT N'the string goes here'

Есть ли принципиальная разница между этим и:

INSERT MyTable 
 SELECT 'the string goes here'

Я понял, что у вас будет только проблема, если строка содержит символ Unicode, а целевой столбец не является unicode. Помимо этого SQL отлично справляется с этим и преобразует строку с N'' в поле varchar (в основном игнорирует N).

У меня создалось впечатление, что N перед строками - хорошая практика, но я не могу найти никакого обсуждения, которое я бы счел окончательным.

Ответ 1

Короткий ответ: отлично подходит для скриптов, плохо для производственного кода.

Это не считается лучшей практикой. Существует недостаток, он создает незначительную производительность, когда два байтовых символа преобразуются в 1 байтовые символы.

Если кто-то не знает, куда идет вставка, или не знает, откуда идет исходный текст (скажем, это утилита для вставки данных общего назначения, которая генерирует инструкции вставки для неизвестной цели, скажем, при экспорте данных), N'foo 'может быть более защитным стилем кодирования.

Таким образом, недостаток мал, и потенциал роста заключается в том, что ваш код script гораздо более адаптируется к изменениям в структуре базы данных. Вероятно, поэтому вы видите это в сценариях вставки больших объемов данных.

Однако, если рассматриваемый код является чем-то, предназначенным для повторного использования в среде, где вы заботитесь о качестве кода, вы не должны использовать N'the string', потому что вы добавляете конверсию, где нет необходимости.

Ответ 2

Вы должны префиксные строки N, если они предназначены для столбца или параметра nvarchar(...). Если они предназначены для столбца или параметра varchar(...), то опустите его, иначе вы получите ненужное преобразование.

Это определенно не "лучшая практика", чтобы придерживаться N перед каждой строкой, независимо от того, для чего она предназначена.

Ответ 3

От INSERT (Transact-SQL)

При ссылке на символ Unicode типы данных nchar, nvarchar и ntext, "выражение" должно иметь префикс заглавная буква "N".

Также читайте в Почему некоторые строки SQL имеют префикс 'N'?

и

Программирование на стороне сервера в Юникоде

Строковые константы Unicode, которые появляются в коде, выполняемом на сервере, как в хранимых процедурах и триггерах, должна предшествовать заглавная буква N. Это верно, даже если столбец ссылка на нее уже определена как Unicode. Без префикса N строка преобразуется в значение по умолчанию кодовая страница базы данных. Это может не распознать определенные символы.