[sql-server] ‘COLLATE SQL_Latin1_General_CP1_CI_AS’의 기능은 무엇입니까?

아래와 같이 SQLServer에서 데이터베이스를 작성하는 SQL 쿼리가 있습니다.

create database yourdb
on
( name = 'yourdb_dat',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdbdat.mdf',
  size = 25mb,
  maxsize = 1500mb,
  filegrowth = 10mb )
log on
( name = 'yourdb_log',
  filename = 'c:\program files\microsoft sql server\mssql.1\mssql\data\yourdblog.ldf',
  size = 7mb,
  maxsize = 375mb,
  filegrowth = 10mb )
COLLATE SQL_Latin1_General_CP1_CI_AS;
go

잘 작동합니다.

나머지 SQL은 분명하지만의 기능에 대해서는 상당히 혼란 스럽습니다 COLLATE SQL_Latin1_General_CP1_CI_AS.

누구든지 나에게 이것을 설명 할 수 있습니까? 또한 이런 방식으로 데이터베이스를 만드는 것이 가장 좋은 방법인지 알고 싶습니다.



답변

데이터베이스 서버가 텍스트를 정렬하는 방법을 설정합니다. 이 경우 :

SQL_Latin1_General_CP1_CI_AS

흥미로운 부분으로 나뉩니다.

  1. latin1 서버가 charset latin 1을 사용하여 문자열을 처리하도록 기본적으로 ascii
  2. CP1 Code Page 1252의 약자
  3. CI 대소 문자를 구분하지 않는 비교이므로 ‘ABC’는 ‘abc’와 같습니다.
  4. AS 악센트에 민감하므로 ‘ü’는 ‘u’와 같지 않습니다.

추신 : 자세한 내용 은 @ solomon-rutzky의 답변읽으십시오 .


답변

허용되는 답변이 약간 불완전하다는 점에 유의하십시오. 예, 가장 기본적인 수준에서 데이터 정렬은 정렬을 처리합니다. 그러나 선택한 데이터 정렬에 의해 정의 된 비교 규칙은 사용자 데이터에 대한 사용자 쿼리 외부의 여러 위치에서 사용됩니다.

“무엇을 COLLATE SQL_Latin1_General_CP1_CI_AS합니까?” “의 COLLATE조항은 CREATE DATABASE무엇입니까?”를 의미합니다.

COLLATE {collation_name}의 절 CREATE DATABASE문을의 기본 데이터 정렬 지정 데이터베이스하지 서버를; 데이터베이스 수준 및 서버 수준 기본 데이터 정렬은 서로 다른 것을 제어합니다.

서버 (예 : 인스턴스) 레벨 컨트롤 :

  • 시스템 데이터베이스에 대한 데이터베이스 수준의 데이터 정렬 : master, model, msdb,와 tempdb.
  • 의 DB 수준 데이터 정렬을 제어하므로 tempdb테이블 변수가 아닌 임시 테이블 (전역 및 로컬)의 문자열 열에 대한 기본 데이터 정렬입니다.
  • 의 DB 수준 데이터 정렬을 제어하기 때문에 데이터베이스 이름 (예 : 열 ), 로그인 이름 등과 같은 서버 수준 데이터에 master사용되는 데이터 정렬입니다 .namesys.databases
  • 매개 변수 / 변수 이름 처리
  • 커서 이름 처리
  • GOTO라벨 취급
  • COLLATE절이 없을 때 새로 작성된 데이터베이스에 사용되는 기본 데이터 정렬

데이터베이스 레벨 컨트롤 :

  • 기본 데이터 정렬이 새로 만들어진 문자열 열 사용 ( CHAR, VARCHAR, NCHAR, NVARCHAR, TEXT,와 NTEXT-하지만 사용하지 않는 TEXTNTEXT)이 때 COLLATE절은 열 정의에서 누락되었습니다. 이것은 모두 이동 CREATE TABLEALTER TABLE ... ADD문.
  • 문자열 리터럴 (ie 'some text') 및 문자열 변수 (ie @StringVariable)에 사용되는 기본 데이터 정렬 . 이 데이터 정렬은 문자열 및 변수를 다른 문자열 및 변수와 비교할 때만 사용됩니다. 문자열 / 변수를 열과 비교할 때 열의 데이터 정렬이 사용됩니다.
  • 개체 이름 (ie ), 열 이름 (ie ), 인덱스 이름 (ie ) 등과 같은 데이터베이스 수준 메타 데이터에 사용되는 데이터 정렬sys.objectssys.columnssys.indexes
  • 데이터베이스 수준 개체에 사용되는 데이터 정렬 : 테이블, 열, 인덱스 등

또한:

  • ASCII는 8 비트 인코딩입니다 (일반적으로 사용하는 경우 기술적으로 “ASCII”는 문자 값이 0-127 인 7 비트이고 “ASCII Extended”는 문자 값이 0-255 인 8 비트입니다). 이 그룹은 여러 문화에서 동일합니다.
  • 코드 페이지는 확장 ASCII의 “확장 된”부분이며 값 128-255에 사용할 문자를 제어합니다.이 그룹은 각 문화권에 따라 다릅니다.
  • Latin1표준 ASCII는 0-127의 값만 포함 하고 SQL Server로 표시 될 수있는 모든 코드 페이지와 심지어는 같은 128 값을 동일한 문자에 매핑하기 때문에 “ASCII”를 의미 하지 않습니다 .NVARCHAR

“무엇을 COLLATE SQL_Latin1_General_CP1_CI_AS합니까?” “이 특정 데이터 정렬의 기능은 무엇입니까?”를 의미합니다.

  • 이름은으로 시작 SQL_하므로 Windows 데이터 정렬이 아닌 SQL Server 데이터 정렬입니다. 공식적으로 더 이상 사용되지 않더라도 이러한 기능은 더 이상 사용되지 않으며 주로 SQL Server 2000 이전 버전과의 호환성을 위해 사용됩니다. 그러나 불행하게도 SQL_Latin1_General_CP1_CI_AS미국 영어를 언어로 사용하는 OS에 설치할 때 기본값이기 때문에 매우 일반적입니다. 가능하면 이러한 데이터 정렬을 피해야합니다.

    윈도우 정렬 (이름이있는 사람 없습니다 로 시작하는이 SQL_), 더 많은 기능, 최신 인 사이의 일관성 정렬이 VARCHARNVARCHAR같은 값을 추가 / 수정 정렬 무게와 대문자 / 소문자 매핑으로 업데이트됩니다. 이러한 데이터 정렬에는 SQL Server 데이터 정렬에 발생할 수있는 잠재적 성능 문제가 없습니다 . VARCHAR 및 NVARCHAR 유형을 혼합 할 때 인덱스에 미치는 영향 .

  • Latin1_General 문화 / 로케일입니다.
    • 내용 NCHAR, NVARCHARNTEXT데이터 분류 및이 비교에 사용 된 언어 적 규칙을 결정한다.
    • 내용 CHAR, VARCHARTEXT데이터 (열, 리터럴 및 변수)이이 결정
      • 정렬 및 비교에 사용되는 언어 규칙.
      • 문자를 인코딩하는 데 사용되는 코드 페이지. 예를 들어 Latin1_General데이터 정렬은 코드 페이지 1252를 Hebrew사용 하고 데이터 정렬은 코드 페이지 1255를 사용합니다.
  • CP{code_page} 또는 {version}

    • 를 들어 SQL 서버 데이터 정렬 : CP{code_page}– 이상 만들 수 2 바이트의 조합을 사용할 수 있습니다 더블 바이트 문자 세트 (DBCS)에 대한 네 개의 코드 페이지가 있지만 255 문자 값 (128)에 매핑하는 것을 결정하는 8 비트 코드 페이지입니다 256 자 (SQL Server 데이터 정렬에는 사용할 수 없음)
    • 들어 윈도우 정렬 : {version}모든 데이터 정렬 이름에 존재하지 않는 동안, 데이터 정렬이 (대부분의 경우) 도입 된 SQL Server 버전을 의미합니다. 이름에 버전 번호가없는 Windows 데이터 정렬은 버전입니다 80(SQL Server 2000은 버전 8.0 임). 모든 SQL Server 버전에 새로운 데이터 정렬이 제공되는 것은 아니므로 버전 번호에 차이가 있습니다. 일부 90(SQL Server 2005, 버전 9.0), 대부분 100(SQL Server 2008, 버전 10.0), 작은 세트 140(SQL Server 2017, 버전 14.0)가 있습니다.

      마지막으로 끝나는 데이터 정렬 _SC이 SQL Server 2012 (버전 11.0)에 도입 되었기 때문에 “대부분”이라고 말 했지만 기본 데이터는 새로운 것이 아니며 기본 제공 함수에 대한 보충 문자 지원 만 추가했습니다. 따라서 이러한 끝은 버전 90100데이터 정렬에 존재 하지만 SQL Server 2012에서만 시작됩니다.

  • 다음으로 민감도를 갖습니다. 다음과 같은 조합이 가능하지만 항상이 순서로 지정됩니다.
    • CS= 대소 문자 구분 또는 CI= 대소 문자 구분
    • AS= 악센트 구분 또는 AI= 악센트 구분
    • KS = 가나 유형 구분 또는 누락 = 가나 유형 구분
    • WS = 너비 또는 누락 = 너비에 둔감
    • VSS = 변형 선택기 구분 (버전 140 데이터 정렬에서만 사용 가능) 또는 누락 = 변형 선택기 구분
  • 선택적인 마지막 조각 :

    • _SC마지막에 “보완 캐릭터 지원”을 의미합니다. “지원”은 내장 함수가 서로 게이트 쌍을 해석하는 방법 (보충 문자가 UTF-16으로 인코딩되는 방식)에만 영향을줍니다. 없는 _SC말 (또는 _140_중간), 내장 기능을 하나의 보조 문자를 볼 수 있지만, 대신에 서로 게이트 쌍을 이루는 두 가지 의미가 코드 포인트가 표시되지 않습니다. 이 엔딩은 이진이 아닌 버전 90 또는 100 데이터 정렬에 추가 할 수 있습니다.
    • _BIN또는 _BIN2마지막에 “이진”정렬 및 비교를 의미합니다. 데이터는 여전히 동일하게 저장되지만 언어 규칙은 없습니다. 이 엔딩은 5 가지 감도 또는와 결합되지 않습니다 _SC. _BIN이전 스타일 _BIN2이며 더 새롭고 정확한 스타일입니다. SQL Server 2005 이상을 사용하는 경우을 사용하십시오 _BIN2. 의 차이점에 대한 자세한 내용 _BIN_BIN2: 참조하십시오 다양한 바이너리 데이터 정렬의 차이점 (문화, 버전 및 BIN BIN2 대) .
    • _UTF8SQL Server 2019의 새로운 옵션입니다. 8 비트 인코딩으로, 유니 코드 데이터 VARCHARCHAR데이터 유형 (더 이상 사용되지 않는 TEXT데이터 유형은 아님)을 저장할 수 있습니다 . 이 옵션은 보충 문자를 지원하는 데이터 정렬 (예 : _SC이름 이 포함 된 버전 90 또는 100 데이터 정렬 및 버전 140 데이터 정렬) 에서만 사용할 수 있습니다 . 단일 이진 _UTF8데이터 정렬 ( _BIN2, not _BIN)도 있습니다.

      참고 사항 : UTF-8은 8 비트 인코딩으로 설정되었지만 유니 코드를 지원하려는 환경 / 코드와 호환되도록 설계 / 생성되었습니다. UTF-8이와 비교하여 최대 50 %의 공간 절약을 제공 할 수있는 몇 가지 시나리오 NVARCHAR가 있지만 부작용으로 많은 / 대부분의 작업에서 약간의 성능 저하가 발생합니다. 호환성을 위해 이것이 필요한 경우 비용이 허용됩니다. 공간 절약을 위해 이것을 원한다면 더 나은 테스트를 거쳤으며 다시 테스트했습니다. 테스트에는 모든 기능과 몇 줄 이상의 데이터가 포함됩니다. UTF-8 데이터 정렬은 모든 열과 데이터베이스 자체에서 VARCHAR데이터 (열, 변수, 문자열 리터럴)를_UTF8대조. 호환성을 위해 이것을 사용하는 모든 사람에게는 자연스러운 상태이지만 공간 절약을 위해 그것을 사용하려는 사람들에게는 그렇지 않습니다. 콜 레이션을 사용하여 VARCHAR 데이터를 비콜 레이션 또는 데이터 를 사용하는 _UTF8데이터와 혼합 할 때는 이상한 동작 / 데이터 손실이 발생할 수 있으므로주의하십시오. 새로운 UTF-8 데이터 정렬에 대한 자세한 내용 은 SQL Server 2019의 기본 UTF-8 지원 : 구주 또는 거짓 예언자? 를 참조하십시오.VARCHAR_UTF8NVARCHAR


답변

CP1은 ‘코드 페이지 1’을 의미합니다. 기술적으로는 코드 페이지 1252로 변환됩니다.


답변

COLLATE는 당신이 문자열 값에 사용하는 종류의 문자 집합 및 규칙 (주문, 대결 규칙)의 지정할 키워드.

예를 들어, 대소 문자를 구분하지 않는 ( CI ) 악센트를 구분하는 ( AS ) 라틴 규칙을 사용하는 경우

문서를 참조 할 수 있습니다


답변

데이터베이스의 기본 데이터 정렬을 지정합니다. 다른 테이블을 지정하지 않으면 데이터베이스의 테이블에서 작성하는 모든 텍스트 필드가 해당 데이터 정렬을 사용합니다.

데이터베이스에는 항상 기본 데이터 정렬이 있습니다. 아무 것도 지정하지 않으면 SQL Server 인스턴스의 기본 데이터 정렬이 사용됩니다.

사용하는 데이터 정렬의 이름은 Latin1 코드 페이지 1을 사용하며 대소 문자를 구분하지 않으며 (CI) 악센트를 구분합니다 (AS). 이 데이터 정렬은 미국에서 사용되므로 미국에서 사용되는 정렬 규칙이 포함됩니다.

데이터 정렬은 텍스트 값이 동일하고 유사하게 비교되는 방법과 정렬 할 때 비교되는 방법을 결정합니다. 코드 페이지는 비 유니 코드 데이터 (예 : varchar 필드)를 저장할 때 사용됩니다.


답변