IT TIP

SQL Server 기본 문자 인코딩

itqueen 2020. 12. 29. 08:15
반응형

SQL Server 기본 문자 인코딩


기본적으로-Microsoft SQL Server의 데이터베이스에 대해 설정된 문자 인코딩은 무엇입니까?

SQL Server에서 현재 문자 인코딩을 어떻게 볼 수 있습니까?


새로 생성 된 데이터베이스의 기본 데이터 정렬을 알아야하는 경우 다음을 사용합니다.

SELECT SERVERPROPERTY('Collation')

실행중인 SQL Server 인스턴스에 대한 서버 데이터 정렬입니다.


인코딩

대부분의 경우 SQL Server는 UCS-2 / UTF-16 (저장소는 동일하고 UTF-16은 보충 문자 만 올바르게 처리 함)으로 유니 코드 데이터 (예 : XMLN접두사가 붙은 형식에 있음)를 저장합니다. 구성 할 수 없습니다. 사용할 옵션이 없습니다.UTF-8 또는UTF-32 ( 맨 아래 re : SQL Server 2019에서 시작하는 UTF-8의 UPDATE 섹션 참조 ) . 내장 함수가 보충 문자를 적절하게 처리 할 수 ​​있는지 여부와 이들이 적절하게 정렬되고 비교되는지 여부는 사용중인 데이터 정렬에 따라 다릅니다. 오래된 데이터 정렬 - 이름으로 시작하는 SQL_(예를 들어 SQL_Latin1_General_CP1_CI_AS) XOR 이름 (예 : 없음 버전 번호 Latin1_General_CI_AS) - (때문에 어떤 종류의 무게가없는에) 서로의 모든 보조 문자를 동일시. SQL Server 2005부터 그들은 90Collations 시리즈 를 소개했습니다._90_이름에서) 최소한 보조 문자에 대해 이진 비교를 수행하여 원하는 순서로 정렬하지 않은 경우에도 구분할 수 있습니다. 이는 100SQL Server 2008에 도입 된 시리즈 데이터 정렬 에도 적용 됩니다. SQL Server 2012에서는 _SC보조 문자를 올바르게 정렬 할뿐만 아니라 기본 제공 함수가 예상대로이를 해석 할 수 있도록하는 이름으로 끝나는 데이터 정렬 (예 : 서로 게이트 쌍 처리)을 도입했습니다. 단일 엔티티로). SQL Server 2017부터 모든 새로운 데이터 정렬 ( 140시리즈)은 암시 적으로 Supplementary Characters를 지원 하므로 이름으로 끝나는 새로운 데이터 정렬이 없습니다 _SC.

SQL Server 2019부터 UTF-8은 CHARVARCHAR데이터 (열, 변수 및 리터럴)에 대해 지원되는 인코딩이 되었지만 그렇지 않습니다 TEXT ( SQL Server 2019에서 시작하는 UTF-8 하단의 UPDATE 섹션 참조 ) .

비 유니 코드 데이터합니다 (에서 발견되는, 즉 어떤 것을 CHAR, VARCHAR그리고 TEXT유형 -하지만 사용하지 않는 TEXT, 사용하는 VARCHAR(MAX)대신) 8 비트 인코딩을 사용 (확장 ASCII, DBCS 또는 EBCDIC). 특정 문자 세트 / 인코딩은 열의 데이터 정렬, 리터럴 및 변수에 대한 현재 데이터베이스의 데이터 정렬 또는 변수 / 커서 이름 및 GOTO레이블 에 대한 인스턴스의 데이터 정렬을 기반으로하는 코드 페이지를 기반으로합니다. , 또는 COLLATE사용중인 경우 절에 지정된 내용 .

로케일이 데이터 정렬과 어떻게 일치하는지 확인하려면 다음을 확인하세요.

특정 데이터 정렬과 연관된 코드 페이지를 보려면 (문자 세트이며 CHAR/ VARCHAR/ TEXT데이터 에만 영향을 미침 ) 다음을 실행하십시오.

SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'CodePage' ) AS [CodePage];

특정 데이터 정렬 (정렬 및 비교 규칙에 영향을 미침)과 연관된 LCID (예 : 로케일)를 보려면 다음을 실행하십시오.

SELECT COLLATIONPROPERTY( 'Latin1_General_100_CI_AS' , 'LCID' ) AS [LCID];

관련 LCID 및 코드 페이지와 함께 사용 가능한 데이터 정렬 목록을 보려면 다음을 실행하십시오.

SELECT [name],
       COLLATIONPROPERTY( [name], 'LCID' ) AS [LCID],
       COLLATIONPROPERTY( [name], 'CodePage' ) AS [CodePage]
FROM sys.fn_helpcollations()
ORDER BY [name];

기본값

서버 및 데이터베이스 기본 데이터 정렬을 살펴보기 전에 해당 기본값의 상대적 중요성을 이해해야합니다.

서버 (인스턴스, 정말) 기본 데이터 정렬이 새로 만든 데이터베이스에 대한 기본값으로 사용됩니다 (시스템 데이터베이스를 포함하여 : master, model, msdb, 및 tempdb). 그러나 이것이 4 개의 시스템 DB를 제외한 모든 데이터베이스가 해당 데이터 정렬을 사용하고 있음을 의미하지는 않습니다. 데이터베이스 기본 데이터 정렬은 언제든지 변경할 수 있습니다 (데이터베이스가 데이터 정렬을 변경하지 못하게하는 종속성이있을 수 있음). 그러나 서버 기본 데이터 정렬은 변경하기가 쉽지 않습니다. 모든 데이터 정렬 변경에 대한 자세한 내용 은 모든 사용자 데이터베이스에서 인스턴스, 데이터베이스 및 모든 열의 데이터 정렬 변경 : 무엇이 잘못 될 수 있습니까?를 참조하십시오.

서버 / 인스턴스 데이터 정렬은 다음을 제어합니다.

  • 지역 변수 이름
  • CURSOR 이름
  • GOTO 라벨
  • 인스턴스 수준 메타 데이터

데이터베이스 기본 데이터 정렬은 다음 세 가지 방법으로 사용됩니다.

  • 새로 생성 된 문자열 열의 기본값으로. 그러나 이것이 문자열 열이 해당 데이터 정렬을 사용하고 있음을 의미하지는 않습니다. 열의 데이터 정렬은 언제든지 변경할 수 있습니다. 여기서 데이터베이스 기본값을 아는 것은 문자열 열이 설정 될 가능성이 가장 높은 항목을 나타내는 데 중요합니다.
  • 문자열 입력을받지 않고 문자열 출력 (예 :)을 생성하는 문자열 리터럴, 변수 및 내장 함수와 관련된 작업에 대한 데이터 정렬로 사용됩니다 IF (@InputParam = 'something'). 여기에서 데이터베이스 기본값을 아는 것은 이러한 작업의 작동 방식을 제어하므로 확실히 중요합니다.
  • 데이터베이스 수준 메타 데이터

정렬이 중 하나에 지정된 컬럼 COLLATE의시 절 CREATE TABLE또는이 ALTER TABLE {table_name} ALTER COLUMN지정되지 않은 경우, 또는, 데이터베이스의 기본에서 가져옵니다.

여기에는 데이터 정렬을 지정할 수있는 여러 계층 (데이터베이스 기본값 / 열 / 리터럴 및 변수)이 있으므로 결과 데이터 정렬은 데이터 정렬 우선 순위에 의해 결정됩니다 .

다음 쿼리는 OS, SQL Server 인스턴스 및 지정된 데이터베이스에 대한 기본 / 현재 설정을 보여줍니다.

SELECT os_language_version,
       ---
       SERVERPROPERTY('LCID') AS 'Instance-LCID',
       SERVERPROPERTY('Collation') AS 'Instance-Collation',
       SERVERPROPERTY('ComparisonStyle') AS 'Instance-ComparisonStyle',
       SERVERPROPERTY('SqlSortOrder') AS 'Instance-SqlSortOrder',
       SERVERPROPERTY('SqlSortOrderName') AS 'Instance-SqlSortOrderName',
       SERVERPROPERTY('SqlCharSet') AS 'Instance-SqlCharSet',
       SERVERPROPERTY('SqlCharSetName') AS 'Instance-SqlCharSetName',
       ---
       DATABASEPROPERTYEX(N'{database_name}', 'LCID') AS 'Database-LCID',
       DATABASEPROPERTYEX(N'{database_name}', 'Collation') AS 'Database-Collation',
   DATABASEPROPERTYEX(N'{database_name}', 'ComparisonStyle') AS 'Database-ComparisonStyle',
       DATABASEPROPERTYEX(N'{database_name}', 'SQLSortOrder') AS 'Database-SQLSortOrder'
FROM   sys.dm_os_windows_info;

설치 기본값

"기본값"에 대한 또 다른 해석은 설치할 때 인스턴스 수준 데이터 정렬에 대해 선택되는 기본 데이터 정렬을 의미 할 수 있습니다. 그것은 OS 언어에 따라 다르지만 (끔찍하고 끔찍한) 기본값 SQL_Latin1_General_CP1_CI_AS. 이 경우 "기본"인코딩은 VARCHAR데이터의 경우 Windows 코드 페이지 1252 이고 항상 그렇듯이 데이터의 경우 UTF-16입니다 NVARCHAR.


업데이트 2018-10-02

SQL Server 2019 introduces native support for UTF-8 in VARCHAR / CHAR datatypes (not TEXT!). This is accomplished via a set of new collations, the names of which all end with _UTF8. This is an interesting capability that will definitely help some folks, but there are some "quirks" with it, especially when UTF-8 isn't being used for all columns and the Database's default Collation, so don't use it just because you have heard that UTF-8 is magically better. UTF-8 was designed solely for ASCII compatibility: to enable ASCII-only systems (i.e. UNIX back in the day) to support Unicode without changing any existing code or files. That it saves space for data using mostly (or only) US English characters (and some punctuation) is a side-effect. When not using mostly (or only) US English characters, data can be the same size as UTF-16, or even larger, depending on which characters are being used. And, in cases where space is being saved, performance might improve, but it might also get worse.

For a detailed analysis of this new feature, please see my post, "Native UTF-8 Support in SQL Server 2019: Savior or False Prophet?".


The default character encoding for a SQL Server database is iso_1, which is ISO 8859-1. Note that the character encoding depends on the data type of a column. You can get an idea of what character encodings are used for the columns in a database as well as the collations using this SQL:

select data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name, count(*) count
from information_schema.columns
group by data_type, character_set_catalog, character_set_schema, character_set_name, collation_catalog, collation_schema, collation_name;

If it's using the default, the character_set_name should be iso_1 for the char and varchar data types. Since nchar and nvarchar store Unicode data in UCS-2 format, the character_set_name for those data types is UNICODE.


SELECT DATABASEPROPERTYEX('DBName', 'Collation') SQLCollation;

Where DBName is your database name.


I think this is worthy of a separate answer: although internally unicode data is stored as UTF-16 in Sql Server this is the Little Endian flavour, so if you're calling the database from an external system, you probably need to specify UTF-16LE.

ReferenceURL : https://stackoverflow.com/questions/5182164/sql-server-default-character-encoding

반응형