본문 바로가기

IT/MS-SQL

접두사 N



MS-SQL 질의문 내 문자열 데이터의 접두사 N에 대하여


  요약

  SQL Server에서 유니코드 문자열 상수를 다룰 때는 모든 유니코드 문자열 앞에 대문자 N이 와야 합니다. 접두사 "N"은 SQL-92 표준에 있는 국가별 언어의 약자이며 반드시 대문자로 표기해야 합니다. 유니코드 문자열 상수에 접두사 N을 사용하지 않으면 SQL Server는 문자열을 사용하기 전에 이 상수를 현재 데이터베이스의 유니코드가 아닌 코드 페이지로 변환합니다.


  추가정보

  이러한 표기법은 기존 응용 프로그램의 이전 버전과의 호환성을 제공하는 데 필요합니다. 예를 들어, "SELECT 'Hello'"는 유니코드 데이터를 지원하지 않는 SQL Server 6.5에서와 같이 유니코드가 아닌 문자열을 반환하는 데 사용됩니다. "SELECT N'Hello'"라는 새로운 구문이 추가되어 SQL Server 7.0과 유니코드 문자열을 주고 받을 수 있습니다.


유니코드 데이터를 SQL Server에 전달할 때마다 유니코드 문자열에 접두사 N을 사용해야 합니다. 유니코드가 사용 가능한 응용 프로그램에서 접두사 N을 사용하지 않고 유니코드 문자열을 SQL Server 7.0에 보내면 문자 데이터가 손실될 수 있습니다. SQL Server가 접두사 N을 사용하지 않은 유니코드 문자열을 유니코드에서 SQL Server 데이터베이스의 코드 페이지로 변환할 때 유니코드 문자열 중에 SQL Server 코드 페이지에 없는 문자는 모두 손실됩니다. 이 변환은 Autotranslation, OemToAnsi 또는 AutoAnsiToOem 변환과 관련이 없으며 모두 ODBC, OLEDB 또는 DB-Library 계층에 있는 클라이언트에서 발생합니다.

응용 프로그램이 유니코드 데이터를 SQL Server로 보내지 않고 클라이언트의 ANSI 코드 페이지가 SQL Server 코드 페이지와 일치하는 경우에는 접두사 N을 문자열 상수에 사용할 필요가 없으며 접두사를 생략해도 데이터가 손실되지 않습니다. 그러나 SQL Server 7.0에서는 설치 과정에서 정렬 순서와는 구별되는 유니코드 데이터 정렬을 선택할 수 있는데 이로 인해 어떤 경우에는 접두사 N이 있는 문자열을 포함하는 작업과 접두사가 없는 문자열을 포함하는 작업이 다른 결과를 가져올 수 있습니다. 예를 들어, SQL Server 7.0을 설치할 때 이진 정렬 순서(정렬 순서는 유니코드가 아닌 문자열을 비교할 때 사용됨)를 선택하고 유니코드 데이터 정렬(유니코드 데이터 정렬은 유니코드 문자열을 비교하기 위해 사용됨)로는 일반 유니코드를 선택했다고 가정합니다. 이진 정렬 순서에 따르면 대문자 "A"가 소문자 "a"와 같지 않기 때문에 유니코드가 아닌 두개의 문자열을 비교하는 ("ABC" = "abc") 식은 False를 반환합니다. 반면에 (N'ABC' = N'abc') 식은 True를 반환합니다. 문자열에 접두사 N을 사용했기 때문에 이 문자열은 유니코드로 변환되고 이 문자열을 비교하는 데 유니코드 데이터 정렬이 사용됩니다. 이진 정렬 순서와는 달리 일반 유니코드 데이터 정렬은 대소문자를 구분하지 않기 때문에 두 개의 문자열을 같은 것으로 간주합니다.

두 개의 문자열 상수 피연산자 중 하나에만 접두사 N을 사용하고 다른 하나에는 사용하지 않았을 경우에는 문자열을 비교할 때 유니코드가 아닌 문자열이 유니코드로 변환되어 유니코드 데이터 정렬이 사용됩니다. 이 동작은 SQL Server 온라인 설명서 "비교 연산자" 항목에 설명되어 있습니다.


출처 : http://support.microsoft.com/kb/239530/ko