[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
흥미로운 부분으로 나뉩니다.
latin1
서버가 charset latin 1을 사용하여 문자열을 처리하도록 기본적으로 asciiCP1
Code Page 1252의 약자CI
대소 문자를 구분하지 않는 비교이므로 ‘ABC’는 ‘abc’와 같습니다.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
사용되는 데이터 정렬입니다 .name
sys.databases
- 매개 변수 / 변수 이름 처리
- 커서 이름 처리
GOTO
라벨 취급COLLATE
절이 없을 때 새로 작성된 데이터베이스에 사용되는 기본 데이터 정렬
데이터베이스 레벨 컨트롤 :
- 기본 데이터 정렬이 새로 만들어진 문자열 열 사용 (
CHAR
,VARCHAR
,NCHAR
,NVARCHAR
,TEXT
,와NTEXT
-하지만 사용하지 않는TEXT
나NTEXT
)이 때COLLATE
절은 열 정의에서 누락되었습니다. 이것은 모두 이동CREATE TABLE
및ALTER TABLE ... ADD
문. - 문자열 리터럴 (ie
'some text'
) 및 문자열 변수 (ie@StringVariable
)에 사용되는 기본 데이터 정렬 . 이 데이터 정렬은 문자열 및 변수를 다른 문자열 및 변수와 비교할 때만 사용됩니다. 문자열 / 변수를 열과 비교할 때 열의 데이터 정렬이 사용됩니다. - 개체 이름 (ie ), 열 이름 (ie ), 인덱스 이름 (ie ) 등과 같은 데이터베이스 수준 메타 데이터에 사용되는 데이터 정렬
sys.objects
sys.columns
sys.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_
), 더 많은 기능, 최신 인 사이의 일관성 정렬이VARCHAR
와NVARCHAR
같은 값을 추가 / 수정 정렬 무게와 대문자 / 소문자 매핑으로 업데이트됩니다. 이러한 데이터 정렬에는 SQL Server 데이터 정렬에 발생할 수있는 잠재적 성능 문제가 없습니다 . VARCHAR 및 NVARCHAR 유형을 혼합 할 때 인덱스에 미치는 영향 . Latin1_General
문화 / 로케일입니다.- 내용
NCHAR
,NVARCHAR
및NTEXT
데이터 분류 및이 비교에 사용 된 언어 적 규칙을 결정한다. - 내용
CHAR
,VARCHAR
및TEXT
데이터 (열, 리터럴 및 변수)이이 결정- 정렬 및 비교에 사용되는 언어 규칙.
- 문자를 인코딩하는 데 사용되는 코드 페이지. 예를 들어
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)에 도입 되었기 때문에 “대부분”이라고 말 했지만 기본 데이터는 새로운 것이 아니며 기본 제공 함수에 대한 보충 문자 지원 만 추가했습니다. 따라서 이러한 끝은 버전90
및100
데이터 정렬에 존재 하지만 SQL Server 2012에서만 시작됩니다.
- 를 들어 SQL 서버 데이터 정렬 :
- 다음으로 민감도를 갖습니다. 다음과 같은 조합이 가능하지만 항상이 순서로 지정됩니다.
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 대) .-
_UTF8
SQL Server 2019의 새로운 옵션입니다. 8 비트 인코딩으로, 유니 코드 데이터VARCHAR
와CHAR
데이터 유형 (더 이상 사용되지 않는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
_UTF8
NVARCHAR
답변
CP1은 ‘코드 페이지 1’을 의미합니다. 기술적으로는 코드 페이지 1252로 변환됩니다.
답변
COLLATE는 당신이 문자열 값에 사용하는 종류의 문자 집합 및 규칙 (주문, 대결 규칙)의 지정할 키워드.
예를 들어, 대소 문자를 구분하지 않는 ( CI ) 악센트를 구분하는 ( AS ) 라틴 규칙을 사용하는 경우
이 문서를 참조 할 수 있습니다
답변
데이터베이스의 기본 데이터 정렬을 지정합니다. 다른 테이블을 지정하지 않으면 데이터베이스의 테이블에서 작성하는 모든 텍스트 필드가 해당 데이터 정렬을 사용합니다.
데이터베이스에는 항상 기본 데이터 정렬이 있습니다. 아무 것도 지정하지 않으면 SQL Server 인스턴스의 기본 데이터 정렬이 사용됩니다.
사용하는 데이터 정렬의 이름은 Latin1 코드 페이지 1을 사용하며 대소 문자를 구분하지 않으며 (CI) 악센트를 구분합니다 (AS). 이 데이터 정렬은 미국에서 사용되므로 미국에서 사용되는 정렬 규칙이 포함됩니다.
데이터 정렬은 텍스트 값이 동일하고 유사하게 비교되는 방법과 정렬 할 때 비교되는 방법을 결정합니다. 코드 페이지는 비 유니 코드 데이터 (예 : varchar 필드)를 저장할 때 사용됩니다.