"N" в предложении where SQL

Я видел этот запрос где-то -

SELECT *
FROM HR.Employees
WHERE country <> N'JAP';

Что означает "N" ? Я не уверен, что это действительно только для SQL-сервера.

Ответы

Ответ 1

N обозначает "национальный символ", а это означает, что содержимое строки Unicode.

Вы должны использовать Unicode (nchar/nvarchar) всякий раз, когда вы сталкиваетесь с именами или другими объектами, которые могут содержать символы за пределами набора символов ASCII по умолчанию. Если вы не окружите такие строки префиксом N, вы потеряете данные. Например:

SELECT N'ук ферт хер', 'ук ферт хер';

Результаты:

-----------        -----------
ук ферт хер        ?? ???? ???

Вы также должны использовать префикс N в своих WHERE или других предложениях против столбцов n(var)char. Если вы не используете префикс N, вы можете столкнуться с серьезными проблемами производительности из-за неявного преобразования.

Ответ 2

Дополнительная информация взята из книги - http://www.amazon.com/Training-Kit-Exam-70-461-Microsoft/dp/0735666059

Если вы пишете выражение, включающее операнды разных типов, SQL Server должен будет применить неявное преобразование для выравнивания типов. В зависимости от обстоятельств неявные преобразования могут иногда снижать производительность. Важно знать правильную форму литералов разных типов и убедиться, что вы используете правильные. Классический пример использования неправильных литеральных типов - строки символов Unicode (типы NVARCHAR и NCHAR).

Правильная форма строкового литерала Unicode - это префикс литерала с большой буквы N и разделение литерала одинарными кавычками; например, N'literal '. Для обычного символьного строкового литерала вы просто разделяете литерал одинарными кавычками; например, "буквальный". Очень типичная дурная привычка - указывать обычный строковый литерал, когда отфильтрованный столбец имеет тип Unicode, как в следующем примере.

SELECT empid, firstname, lastname
FROM HR.Employees
WHERE lastname = 'Davis';

Поскольку столбец и литерал имеют разные типы, SQL Server неявно преобразует один тип операндов в другой. К счастью, в этом примере SQL Server преобразует тип литералов в тип столбцов, поэтому он все еще может эффективно полагаться на индексирование. Однако могут быть случаи, когда неявное преобразование снижает производительность. Рекомендуется использовать правильную форму, как показано ниже.

SELECT empid, firstname, lastname
FROM HR.Employees
WHERE lastname = N'Davis';