2013-08-29 6 views
16

Я видел этот запрос где-то -«N» в ИНЕКЕ SQL

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

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

ответ

32

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

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

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

Результаты:

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

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

+0

Могу ли я найти ссылку для получения более подробной информации? Я попробовал Google, но не получил информацию. Это вид результатов поиска, которые я получаю: http://stackoverflow.com/questions/3895387/whats-the-sql-national-character-nchar-datatype-really-for – Steam

+1

+1 Я знаю, что это был Unicode навсегда и никогда не потрудился выяснить, что означало N. –

+1

@blasto [много информации здесь] (http://en.wikipedia.org/wiki/Unicode). –

2

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

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

Правильная форма для символьного символа строки Юникода - это префикс литерала со значением капитала 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';