programing

SQL Server 기본 문자 인코딩

batch 2023. 6. 25. 18:35
반응형

SQL Server 기본 문자 인코딩

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

SQL Server의 현재 문자 인코딩을 보려면 어떻게 해야 합니까?

인코딩

경우 데이터 "SQL Server" " " " " " (", " " " " " " "에 있는 데이터)를합니다.XML그리고.NUCS-2/UTF-16(스토리지는 동일하지만 UTF-16은 보조 문자만 올바르게 처리함).이것은 구성할 수 없습니다. UTF-8 또는 UTF-32를 사용할 수 있는 옵션이 없습니다. 내장된 기능이 보조 문자를 제대로 처리할 수 있는지 여부와 이러한 문자가 올바르게 정렬되고 비교되는지 여부는 사용 중인 조합에 따라 다릅니다.이전 콜리메이션 - 이름이 다음으로 시작합니다.SQL_ (예:)SQL_Latin1_General_CP1_CI_ASx 또는 이름에 버전 번호가 없습니다(예:Latin1_General_CI_AS — 가중치가 하게 지정합니다. — 정렬 가중치가 없기 때문에 모든 보조 문자를 서로 동일하게 지정합니다.으로 SQL Server 를 소개했습니다.90 콜리케이션(시리데이정렬터이(함포데이터된즈이)▁with)이 있는 것)_90_이름에서)는 최소한 보조 문자에 대해 이진 비교를 수행하여 원하는 순서로 정렬하지 않더라도 문자를 구별할 수 있습니다.이는 또한 다음과 같은 경우에도 적용됩니다.1002008에 Collections. 에서는 SQL Server 2008으로 를 도입했습니다. SQL Server 2012에서는 SQL Server 2012를 소개했습니다._SC이는 보조 문자를 올바르게 정렬할 뿐만 아니라 내장 함수가 예상대로 해석할 수 있도록 합니다(즉, 대리 쌍을 단일 엔터티로 처리). Collations Server 2017부터 시작됨)140series)는 보조 문자를 암시적으로 지원하므로 이름이 다음으로 끝나는 새 콜리메이션이 없습니다._SC.

부터 UTF-8(SQL Server 2019)에서.CHAR그리고.VARCHAR(변수, 변및리럴그), 그지않음렇나러터TEXT (see UPDATE section at the bottom re: UTF-8 starting in SQL Server 2019).

가 아닌 유코가즉데이터아닌(니, 에확수있데이터는할드인)에 있는 CHAR,VARCHAR,그리고.TEXT유형 - 그러나 사용하지 않음TEXT,사용하다VARCHAR(MAX)대신)는 8비트 인코딩(확장 ASCII, DBCS 또는 EBCDIC)을 사용합니다. 집합Page를 Page는 열 및과 "" 및 "Instance"를. 코드 페이지는 열의 정렬, 리터럴 및 변수에 대한 현재 데이터베이스의 정렬, 변수 / 커서 이름에 대한 인스턴스의 정렬 및GOTO레이블 또는 에서 지정된 항목COLLATE사용하는 경우의 조항

로케일이 데이터 정렬에 어떻게 일치하는지 확인하려면 다음을 확인하십시오.

특정 데이터 정렬과 관련된 코드 페이지 보기(문자 집합이며 영향을 미치는 경우만 해당)CHAR/VARCHAR/TEXTdata), 다음을 실행합니다.

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를 제외한 모든 데이터베이스가 해당 Collation을 사용하고 있음을 의미하지는 않습니다.데이터베이스 기본 데이터 정렬은 언제든지 변경할 수 있습니다(데이터베이스가 데이터 정렬을 변경하지 못하도록 하는 종속성이 있음에도 불구하고).그러나 서버 기본 데이터 정렬은 변경하기가 쉽지 않습니다.모든 데이터 정렬 변경에 대한 자세한 내용은 다음을 참조하십시오.모든 사용자 데이터베이스에서 인스턴스, 데이터베이스 및 모든 열의 조합 변경: 무엇이 잘못될 수 있을까요?

서버/인스턴스 조합은 다음을 제어합니다.

  • 로컬 변수 이름
  • 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;

설치 기본값

"default"에 대한 또 다른 해석은 설치할 때 인스턴스 수준 조합에 대해 선택된 기본 조합을 의미할 수 있습니다.OS 언어에 따라 다르지만 "US English"를 사용하는 시스템의 (끔찍하고 끔찍한) 기본값은SQL_Latin1_General_CP1_CI_AS이 경우, "기본" 인코딩은 다음에 대한 Windows Code Page 1252입니다.VARCHAR데이터, 그리고 항상 그렇듯이, UTF-16은NVARCHAR기본 SQL Server 컬렉션에 대한 OS 언어 목록은 여기에서 찾을 수 있습니다. 컬렉션 및 유니코드 지원: 서버 레벨 컬렉션.이러한 기본값은 재정의될 수 있습니다. 이 목록은 설치 중에 재정의되지 않는 경우 인스턴스가 사용하는 항목에 불과합니다.


업데이트 2018-10-02

SQL Server 2019에는 UTF-8에 대한 기본 지원이 도입되었습니다.VARCHAR/CHAR데이터 유형(그렇지 않음)TEXT!) 이 작업은 이름이 모두 다음으로 끝나는 일련의 새 조합을 통해 수행됩니다._UTF8이 기능은 분명 일부 사용자에게 도움이 될 흥미로운 기능이지만, 특히 UTF-8이 모든 과 데이터베이스의 기본 데이터 정렬에 사용되지 않을 때에는 "어두운" 기능이 있습니다. 따라서 UTF-8이 마법처럼 더 낫다는 말만 들었다고 사용하지 마십시오.UTF-8은 ASCII 호환성만을 위해 설계되었습니다. 즉, ASCII 전용 시스템(예: 과거 UNIX)이 기존 코드나 파일을 변경하지 않고 유니코드를 지원할 수 있도록 지원합니다.대부분(또는 일부 구두점)의 미국식 영어 문자를 사용하여 데이터 공간을 절약하는 것은 부작용입니다.대부분의 미국식 영어 문자를 사용하지 않는 경우, 사용 중인 문자에 따라 데이터 크기가 UTF-16과 같거나 더 클 수 있습니다.또한 공간을 절약하는 경우 성능이 향상될 수도 있지만 더 나빠질 수도 있습니다.

이 새로운 기능에 대한 자세한 분석은 "SQL Server 2019의 네이티브 UTF-8 지원: Savior 또는 False Predator?"라는 제 게시물을 참조하십시오.

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

SELECT SERVERPROPERTY('Collation')

실행 중인 SQL Server 인스턴스에 대한 서버 조합입니다.

SQL Server 데이터베이스의 기본 문자 인코딩은 ISO 8859-1인 iso_1입니다.문자 인코딩은 열의 데이터 유형에 따라 달라집니다.다음 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;

기본값을 사용하는 경우 char 및 varchar 데이터 유형에 대해 character_set_name은 iso_1이어야 합니다.nchar 및 nvarchar는 Unicode 데이터를 UCS-2 형식으로 저장하므로 이러한 데이터 유형의 character_set_name은 UNICODE입니다.

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

여기서 DBName은 데이터베이스 이름입니다.

유니코드 데이터가 내부적으로 SQL Server에 UTF-16으로 저장되어 있지만 이는 리틀 엔디언 맛이므로 외부 시스템에서 데이터베이스를 호출하는 경우 UTF-16LE를 지정해야 합니다.

다음 코드와 같이 각 테이블에 대한 데이터 정렬 설정을 볼 수 있습니다.

SELECT t.name TableName, c.name ColumnName, collation_name  
FROM sys.columns c  
INNER JOIN sys.tables t on c.object_id = t.object_id where t.name = 'name of table';

언급URL : https://stackoverflow.com/questions/5182164/sql-server-default-character-encoding

반응형