'COLLATE SQL_Latin1_General_CP1_CI_AS'의 기능은 무엇입니까?


134

아래와 같이 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.

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

답변:


246

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

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의 답변읽으십시오 .


11
무엇이이 사이의 차이가 될 것입니다 SQL_Latin1_General_CI_AS. 특히 CP1 이 궁금해졌습니다.
Kad

7
@ Kad :이없는 것 같습니다 SQL_Latin1_General_CI_AS. 오히려가 있습니다 Latin1_General_CI_AS. 참조하십시오 SELECT * FROM fn_helpcollations() where name IN ('SQL_Latin1_General_CP1_CI_AS','Latin1_General_CI_AS','SQL_Latin1_General_CI_AS');. 두 데이터 정렬 간에는 정렬 및 비교와 관련하여 미묘한 차이가 있습니다. olcot.co.uk/sql-blogs/…를 참조하십시오 .
라일리 메이저

4
@Kad : CP1은 코드 페이지 1252를 나타냅니다. 코드 페이지는 16 진수 값을 문자 집합의 특정 문자에 매핑하는 조회 테이블입니다. CP1은 Microsoft 하위 문화권에서 CP1252의 줄임말입니다. Windows는 CP1252를 DOS 시절의 보류로 고유하게 사용하는 유일한 플랫폼입니다. ISO 8859-1과 매우 유사하지만 동일하지 않습니다. 유로와 같은 매핑 문자에는 ISO 8859-1에없는 문자가 약간 다릅니다.
slartibartfast

완벽한 답변 @Kris!
gaurav

@Kris SQL2019의 SQL_Latin1_General_CP1_CI_AS에 대한 UTF-8 대안이 있습니까?
Chanky

72

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

"무엇을 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


5
많은 정보와 노력을 담아서 이것을 찬성했지만 내 대답은 확실히 틀리지 않습니다 (데이터베이스는 데이터를 저장하고 데이터베이스 서버는이 데이터에 대해 정렬하고 정렬합니다). OP가 아마도 가능한 모든 정보를 충분히 찾지는 못했기 때문에 완전한 수학 정밀도보다 간결성을 선택했습니다.
Kris

4
안녕하세요 @Kris. 감사. 공평하게, 나는 당신의 대답이 완전히 잘못되었다고 말하지 않았고, 단지 비참하게 불완전합니다. 희망적으로 그것을 명확히하기 위해 업데이트되었습니다. 나는 당신이 말하는 것을 얻었지만 OP는 그 COLLATE조항이 무엇인지 물었습니다 CREATE DATABASE. 당신은 몇 가지 일 중 하나를 말했다. OP가 10 % 만 답을 원한다고 가정하는 이유는 무엇입니까? 모든 정보가 제시되면 각 개인이 얼마나 많은 정보를 취할지 결정할 수 있습니다. 그러나 정보가 일부만 제공되면 정보가 선택되었습니다. 대부분의 정보가 잘 알려지지 않았기 때문에 가능한 한 많은 정보를 제공하기로 결정했습니다. (계속)
Solomon Rutzky

5
나는 당신이 무슨 뜻인지 알지만 너무 많은 정보를 제공하기보다는 충분한 정보를 제공하는 것을 목표로합니다. 너무 많은 정보는 많은 사람들에게 너무 복잡해집니다. 어떤 상황에서도 충분한 정보를 제공하지 못하면 후속 질문이있을 것입니다. (나는 또한이 주제에 대해 그렇게 많은 관심을 기대하지 않았다)
Kris

8
@Kris 나는 "감사합니다!"라는 말을 한동안 의미했습니다. 그런 성숙함과 전문성을 보여 주신 나는 사람들이 자신이 틀렸다고 말한 다음 상호 작용하기가 "어려워지는"(또는 더 어려운) 사람에게 개인적인 공격을하는 것에 다소 익숙합니다. 그러나 "허용 된 답변이 잘못되었습니다. "에 대한 귀하의 측정 된 응답은 저의 소개를 어색하게 만들었으며, 다른 사람들에게 적절하고 생산적으로 의사 소통하는 방법에 대한 모범이되어야합니다.
Solomon Rutzky

4
당신은 내가 어떻게 든 긍정적 인 영향을 미쳤다는 소식을 환영합니다. 그러나 "잘못된"것을 좋아합니다. 새로운 것을 배울 수있는 기회가 열립니다.
Kris

24

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


16

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

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

문서를 참조 할 수 있습니다


9

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

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

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

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


잘못 ( not기본값을 승인 할 수 있지만 데이터 정렬을 지정할 수 없음 ) 잘못 (유니 코드 데이터에도
사용됨

@Richard aka cyberkiwi : 설명서 확인 : msdn.microsoft.com/en-us/library/ms176061.aspx 데이터 정렬 지정 선택 사항입니다. 코드 페이지 8 비트 코드 페이지 인덱스가 아닌 16 비트 유니 코드 코드 포인트로 저장되므로 유니 코드 데이터를 저장하는 데 사용되지 않습니다.
Guffa

나는 당신의 대답을 잘못 읽었지만 여전히 잘못되었습니다. 데이터베이스는 항상 기본 데이터 정렬 = SERVER 데이터 정렬 을 가지지 않습니다 Latin1_General_CI_AS. 절반 은 UI에서 기본값을 수락 해야하는 SERVER 데이터 정렬 에 대한 진술이 절반으로 예상 되었기 때문에 잘못 읽었습니다 . 2 점의 경우 것 같다 의미 가 정렬이되어 있지 (당신이 전환에도 불구하고 유니 코드 데이터를 정렬에 사용 sortingstoring지난 2 개 문장). 유니 코드 텍스트 데이터도 데이터 정렬을 따릅니다.
RichardTheKiwi

@Richard 일명 cyberkiwi : 나는 연결된 특정 문서와 일치하도록 기본 데이터 정렬에 대한 단락을 변경했습니다. (서버 버전에 따라 다릅니다.) 두 번째 요점에 대해서는 더 명확하게 만드는 방법을 볼 수 없습니다. 텍스트는 비 유니 코드 데이터를 저장할코드 페이지 가 사용 된다고 말합니다 . 코드 페이지는 정렬을 결정하는 데 사용되지 않으며 유니 코드 데이터와 비 유니 코드 데이터에 대해서도 사용되지 않습니다.
Guffa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.