

# Babelfish for Aurora PostgreSQL의 데이터 정렬 이해
<a name="babelfish-collations"></a>

Babelfish를 사용하여 Aurora PostgreSQL DB 클러스터를 생성하는 경우 데이터의 데이터 정렬을 선택하게 됩니다. *데이터 정렬*은 주어진 문자 언어로 텍스트 또는 문자를 생성하는 정렬 순서와 비트 패턴을 지정합니다. 데이터 정렬에는 지정된 비트 패턴 세트에 대한 데이터를 비교하는 규칙이 포함됩니다. 데이터 정렬은 현지화와 관련이 있습니다. 서로 다른 로캘은 문자 매핑, 정렬 순서 등에 영향을 줍니다. 데이터 정렬 속성은 다양한 데이터 정렬의 이름에 반영됩니다. 속성에 대한 자세한 내용은 [Babelfish collation attributes table](#bfish-collation-attributes-table) 섹션을 참조하세요.

Babelfish는 SQL Server 데이터 정렬을 Babelfish에서 제공하는 유사한 데이터 정렬에 매핑합니다. Babelfish는 문화적으로 민감한 문자열 비교 및 정렬 순서를 사용하여 유니코드 데이터 정렬을 미리 정의합니다. 또한 Babelfish는 SQL Server DB에 있는 데이터 정렬을 가장 r근접하게 일치하는 Babelfish 데이터 정렬로 변환하는 방법을 제공합니다. 로캘별 데이터 정렬은 다양한 언어 및 지역에 대해 제공됩니다.

일부 데이터 정렬은 클라이언트 측 인코딩에 해당하는 코드 페이지를 지정합니다. Babelfish는 각 출력 열의 데이터 정렬에 따라 서버 인코딩에서 클라이언트 인코딩으로 자동 변환됩니다.

Babelfish는 [Babelfish supported collations table](#bfish-collations-table)에 나열된 데이터 정렬을 지원합니다. Babelfish는 SQL Server 데이터 정렬을 Babelfish에서 제공하는 유사한 데이터 정렬에 매핑합니다.

Babelfish는 International Components for Unicode(ICU) 데이터 정렬 라이브러리 버전 153.80을 사용합니다. ICU 데이터 정렬의 자세한 내용은 ICU 설명서의 [데이터 정렬](https://unicode-org.github.io/icu/userguide/collation/)을 참조하세요. PostgreSQL 및 데이터 정렬에 대한 자세한 내용은 PostgreSQL 설명서의 [Collation Support](https://www.postgresql.org/docs/current/collation.html)(데이터 정렬 지원)을 참조하세요.

**Topics**
+ [데이터 정렬 및 로캘을 제어하는 DB 클러스터 파라미터](#babelfish-collations.parameters)
+ [Babelfish의 결정적 및 비결정적 데이터 정렬](#babelfish-collations.deterministic-nondeterministic)
+ [Babelfish의 데이터베이스 수준에서 지원되는 데이터 정렬](#babelfish-collations.database-level)
+ [Babelfish의 서버 및 객체 데이터 정렬](#babelfish-collations.reference-tables-supported-collations)
+ [Babelfish의 기본 데이터 정렬 동작](#babelfish-collations-default)
+ [데이터 정렬 관리](collation.managing.md)
+ [데이터 정렬 제한 및 동작 차이점](collation.limitations.md)

## 데이터 정렬 및 로캘을 제어하는 DB 클러스터 파라미터
<a name="babelfish-collations.parameters"></a><a name="collation-related-parameters"></a>

다음 파라미터는 데이터 정렬 동작에 영향을 줍니다.

**babelfishpg\$1tsql.default\$1locale**  
이 파라미터는 데이터 정렬에 사용되는 기본 로캘을 지정합니다. 또한, [Babelfish collation attributes table](#bfish-collation-attributes-table)에 나열된 속성과 함께 사용되어 특정 언어 및 지역에 대한 데이터 정렬을 사용자 지정합니다. 이 파라미터의 기본값은 `en-US`입니다.  
기본 로캘은 BBF로 시작하는 모든 Babelfish 데이터 정렬 이름과 Babelfish 데이터 정렬에 매핑되는 모든 SQL Server 데이터 정렬에 적용됩니다. 기존 Babelfish DB 클러스터의 이 파라미터에 대한 설정을 변경해도 기존 데이터 정렬의 로캘에는 영향을 주지 않습니다. 데이터 정렬 목록은 [Babelfish supported collations table](#bfish-collations-table) 섹션을 참조하세요.

**babelfishpg\$1tsql.server\$1collation\$1name**  
이 파라미터는 서버(Aurora PostgreSQL DB 클러스터 인스턴스)와 데이터베이스의 기본 데이터 정렬을 지정합니다. 기본값은 `sql_latin1_general_cp1_ci_as`입니다. T-SQL에서 서버 데이터 정렬이 식별자를 비교하는 방법을 결정하므로 `server_collation_name`은 `CI_AS` 데이터 정렬이어야 합니다.  
Babelfish DB 클러스터를 생성할 때 선택 가능한 목록에서 **데이터 정렬 이름(Collation name)**을 선택합니다. 여기에는 [Babelfish supported collations table](#bfish-collations-table)에 나열된 데이터 정렬이 포함됩니다. Babelfish 데이터베이스가 생성된 후 `server_collation_name`을 수정하지 마세요.

Babelfish for Aurora PostgreSQL DB 클러스터를 생성할 때 선택하는 설정은 이러한 파라미터의 클러스터와 연결된 DB 클러스터 파라미터 그룹에 저장되고 데이터 정렬 동작을 설정합니다.

## Babelfish의 결정적 및 비결정적 데이터 정렬
<a name="babelfish-collations.deterministic-nondeterministic"></a>

Babelfish는 결정적이고 비결정적인 데이터 정렬을 지원합니다.
+ *결정적 데이터 정렬*은 동일한 바이트 시퀀스를 가진 문자를 동등하게 평가합니다. 이는 `x` 및 `X`가 결정적 데이터 정렬에서는 동일하지 않다는 뜻입니다. 결정적 데이터 정렬에는 대소문자 구분(CS) 및 악센트 구분(AS)이 적용됩니다.
+ *비결정적 데이터 정렬*은 똑같이 일치할 필요가 없습니다. 비결정적 데이터 정렬은 `x` 및 `X`를 동일한 것으로 확인합니다. 비결정적 데이터 정렬은 대소문자 구분하지 않음(CI)이나 악센트 구분하지 않음(AI) 또는 둘 다가 적용됩니다.

다음 테이블에서 비결정적 데이터 정렬을 사용할 때 Babelfish와 PostgreSQL 간의 동작 차이점을 확인할 수 있습니다.


| Babelfish | PostgreSQL | 
| --- | --- | 
|  CI\$1AS 데이터 정렬에 대한 LIKE 절을 지원합니다.  |  비결정적 데이터 정렬에서는 LIKE 절을 지원하지 않습니다.  | 
|  Babelfish 버전 4.2.0의 다음 AI 데이터 정렬에서만 LIKE 절을 지원합니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonRDS/latest/AuroraUserGuide/babelfish-collations.html)  |  비결정적 데이터 정렬에서는 LIKE 절을 지원하지 않습니다.  | 

SQL Server 및 PostgreSQL과 비교하여 Babelfish의 기타 제한 사항 및 동작 차이점에 대한 목록은 [데이터 정렬 제한 및 동작 차이점](collation.limitations.md) 섹션을 참조하세요.

Babelfish와 SQL Server는 다음 테이블과 같이 데이터 정렬 속성을 설명하는 데이터 정렬에 대한 명명 규칙을 따릅니다.<a name="bfish-collation-attributes-table"></a>


| 속성 | 설명 | 
| --- | --- | 
| AI | 악센트 구분하지 않음. | 
| AS | 악센트 구분. | 
| BIN2 | BIN2는 코드 포인트 순서대로 데이터를 정렬하도록 요청합니다. 유니코드 코드 포인트 순서는 UTF-8, UTF-16 및 UCS-2 인코딩의 문자 순서와 동일합니다. 코드 포인트 순서는 빠른 결정적 데이터 정렬입니다. | 
| CI | 대소문자 구분하지 않음. | 
| CS | 대소문자 구분. | 
| PREF | 소문자 앞에 대문자를 정렬하려면 PREF 데이터 정렬을 사용합니다. 비교가 대소문자를 구분하지 않는 경우 다른 구분이 없으면 대문자 버전은 소문자 버전 앞에 정렬됩니다. ICU 라이브러리는 `colCaseFirst=upper`의 대문자 기본 설정을 지원하지만 CI\$1AS 데이터 정렬은 지원하지 않습니다. PREF는 `CS_AS` 결정적 데이터 정렬에만 적용될 수 있습니다. | 

## Babelfish의 데이터베이스 수준에서 지원되는 데이터 정렬
<a name="babelfish-collations.database-level"></a>

다음 데이터 정렬은 Babelfish의 데이터베이스 수준에서 지원됩니다.
+ bbf\$1unicode\$1bin2
+ bbf\$1unicode\$1cp1\$1ci\$1ai
+ bbf\$1unicode\$1cp1\$1ci\$1as
+ bbf\$1unicode\$1cp1250\$1ci\$1ai
+ bbf\$1unicode\$1cp1250\$1ci\$1as
+ bbf\$1unicode\$1cp1257\$1ci\$1ai
+ bbf\$1unicode\$1cp1257\$1ci\$1as
+ estonian\$1ci\$1ai
+ estonian\$1ci\$1as
+ finnish\$1swedish\$1ci\$1ai
+ finnish\$1swedish\$1ci\$1as
+ french\$1ci\$1ai
+ french\$1ci\$1as
+ latin1\$1general\$1bin2
+ latin1\$1general\$1ci\$1ai
+ latin1\$1general\$1ci\$1as
+ latin1\$1general\$190\$1bin2
+ latin1\$1general\$1100\$1bin2
+ latin1\$1general\$1140\$1bin2
+ modern\$1spanish\$1ci\$1ai
+ modern\$1spanish\$1ci\$1as
+ polish\$1ci\$1ai
+ polish\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1\$1ci\$1ai
+ sql\$1latin1\$1general\$1cp1\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1250\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1251\$1ci\$1as
+ sql\$1latin1\$1general\$1cp1257\$1ci\$1as
+ traditional\$1spanish\$1ci\$1ai
+ traditional\$1spanish\$1ci\$1as

**참고**  
데이터베이스 수준에서 다른 데이터 정렬을 사용하려면 서버 수준 데이터 정렬과 일치하는지 확인합니다. 자세한 내용은 [Babelfish의 서버 및 객체 데이터 정렬](#babelfish-collations.reference-tables-supported-collations) 단원을 참조하세요.

## Babelfish의 서버 및 객체 데이터 정렬
<a name="babelfish-collations.reference-tables-supported-collations"></a>

다음 데이터 정렬을 서버 데이터 정렬 또는 객체 데이터 정렬로 사용합니다.<a name="bfish-collations-table"></a>


| 데이터 정렬 ID | 참고 | 
| --- | --- | 
|  bbf\$1unicode\$1general\$1ci\$1as  |  대소문자를 구분하지 않는 비교와 LIKE 연산자를 지원합니다.  | 
|  bbf\$1unicode\$1cp1\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1252.txt)은 CP1252라고도 합니다.  | 
|  bbf\$1unicode\$1CP1250\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1250.txt)은 라틴 문자를 사용하는 중부 유럽 및 동유럽 언어로 텍스트를 표현하는 데 사용됩니다.  | 
|  bbf\$1unicode\$1CP1251\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1251.txt)은 키릴 문자를 사용하는 언어에 사용됩니다.  | 
|  bbf\$1unicode\$1cp1253\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1253.txt)은 현대 그리스어를 표현하는 데 사용됩니다.  | 
|  bbf\$1unicode\$1cp1254\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1254.txt)은 터키어를 지원합니다.  | 
|  bbf\$1unicode\$1cp1255\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1255.txt)은 히브리어를 지원합니다.  | 
|  bbf\$1unicode\$1cp1256\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1256.txt)은 아랍 문자를 사용하는 언어를 작성하는 데 사용됩니다.  | 
|  bbf\$1unicode\$1cp1257\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1257.txt)은 에스토니아어, 라트비아어 및 리투아니아어를 지원하는 데 사용됩니다.  | 
|  bbf\$1unicode\$1cp1258\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1258.txt)은 베트남 문자를 작성하는 데 사용됩니다.  | 
|  bbf\$1unicode\$1cp874\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit874.txt)은 태국 문자를 작성하는 데 사용됩니다.  | 
|  sql\$1latin1\$1general\$1cp1250\$1ci\$1as  |  [비결정적 싱글바이트 문자 인코딩](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1250.txt)은 라틴 문자를 표현하는 데 사용됩니다.  | 
|  sql\$1latin1\$1general\$1cp1251\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1251.txt)은 라틴 문자를 지원합니다.  | 
|  sql\$1latin1\$1general\$1cp1\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1252.txt)은 라틴 문자를 지원합니다.  | 
|  sql\$1latin1\$1general\$1cp1253\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1253.txt)은 라틴 문자를 지원합니다.  | 
|  sql\$1latin1\$1general\$1cp1254\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1254.txt)은 라틴 문자를 지원합니다.  | 
|  sql\$1latin1\$1general\$1cp1255\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1255.txt)은 라틴 문자를 지원합니다.  | 
|  sql\$1latin1\$1general\$1cp1256\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1256.txt)은 라틴 문자를 지원합니다.  | 
|  sql\$1latin1\$1general\$1cp1257\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1257.txt)은 라틴 문자를 지원합니다.  | 
|  sql\$1latin1\$1general\$1cp1258\$1ci\$1as  |  [비결정적 데이터 정렬](https://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/bestfit1258.txt)은 라틴 문자를 지원합니다.  | 
|  chinese\$1prc\$1ci\$1as  |  비결정적 데이터 정렬은 중국어(PRC)를 지원합니다.  | 
|  cyrillic\$1general\$1ci\$1as  |  비결정적 데이터 정렬은 키릴어를 지원합니다.  | 
|  finnish\$1swedish\$1ci\$1as  |  비결정적 데이터 정렬은 핀란드어를 지원합니다.  | 
|  french\$1ci\$1as  |  비결정적 데이터 정렬은 프랑스어를 지원합니다.  | 
|  japanese\$1ci\$1as  | 비결정적 데이터 정렬은 일본어를 지원합니다. Babelfish 2.1.0 이상 릴리스에서 지원됩니다. | 
|  korean\$1wansung\$1ci\$1as  |  비결정적 데이터 정렬은 한국어를 지원합니다(사전 정렬 사용).  | 
|  latin1\$1general\$1ci\$1as  |  비결정적 데이터 정렬은 라틴 문자를 지원합니다.  | 
|  modern\$1spanish\$1ci\$1as  |  비결정적 데이터 정렬은 현대 스페인어를 지원합니다.  | 
|  polish\$1ci\$1as  |  비결정적 데이터 정렬은 폴란드어를 지원합니다.  | 
|  thai\$1ci\$1as  |  비결정적 데이터 정렬은 태국어를 지원합니다.  | 
|  traditional\$1spanish\$1ci\$1as  |  비결정적 데이터 정렬은 스페인어(전통에 따라 정렬)를 지원합니다.  | 
|  turkish\$1ci\$1as  |  비결정적 데이터 정렬은 터키어를 지원합니다.  | 
|  ukrainian\$1ci\$1as  |  비결정적 데이터 정렬은 우크라이나어를 지원합니다.  | 
|  vietnamese\$1ci\$1as  |  비결정적 데이터 정렬은 베트남어를 지원합니다.  | 

다음 데이터 정렬을 객체 데이터 정렬로 사용할 수 있습니다.<a name="bfish-icu-collations-table"></a>


| 언어 | 결정적 옵션 | 비결정적 옵션 | 
| --- | --- | --- | 
|  아랍어  |  Arabic\$1CS\$1AS  |  Arabic\$1CI\$1AS Arabic\$1CI\$1AI  | 
|  아랍어 문자  |  BBF\$1Unicode\$1CP1256\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1256\$1CS\$1AS  |  BBF\$1Unicode\$1CP1256\$1CI\$1AI BBF\$1Unicode\$1CP1256\$1CS\$1AI  | 
|  바이너리  |  latin1\$1general\$1bin2 BBF\$1Unicode\$1BIN2  |  –  | 
|  라틴 문자를 사용하는 중부 유럽 및 동유럽 언어  |  BBF\$1Unicode\$1CP1250\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1250\$1CS\$1AS  |  BBF\$1Unicode\$1CP1250\$1CI\$1AI BBF\$1Unicode\$1CP1250\$1CS\$1AI  | 
|  중국어  |  Chinese\$1PRC\$1CS\$1AS  |  Chinese\$1PRC\$1CI\$1AS Chinese\$1PRC\$1CI\$1AI  | 
|  키릴 문자\$1일반  |  Cyrillic\$1General\$1CS\$1AS  |  Cyrillic\$1General\$1CI\$1AS Cyrillic\$1General\$1CI\$1AI  | 
|  키릴 문자  |  BBF\$1Unicode\$1CP1251\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1251\$1CS\$1AS  |  BBF\$1Unicode\$1CP1251\$1CI\$1AI BBF\$1Unicode\$1CP1251\$1CS\$1AI  | 
|  에스토니아어  |  Estonian\$1CS\$1AS  |  Estonian\$1CI\$1AS Estonian\$1CI\$1AI  | 
|  에스토니아어, 라트비아어, 리투아니아어  |  BBF\$1Unicode\$1CP1257\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1257\$1CS\$1AS  |  BBF\$1Unicode\$1CP1257\$1CI\$1AI BBF\$1Unicode\$1CP1257\$1CS\$1AI  | 
|  필란드어\$1스웨덴어  |  Finnish\$1Swedish\$1CS\$1AS  |  Finnish\$1Swedish\$1CI\$1AS Finnish\$1Swedish\$1CI\$1AI  | 
|  프랑스어  |  French\$1CS\$1AS  |  French\$1CI\$1AS French\$1CI\$1AI  | 
|  그리스어  |  Greek\$1CS\$1AS  |  Greek\$1CI\$1AS Greek\$1CI\$1AI  | 
|  히브리어  |  BBF\$1Unicode\$1CP1255\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1255\$1CS\$1AS Hebrew\$1CS\$1AS  |  BBF\$1Unicode\$1CP1255\$1CI\$1AI BBF\$1Unicode\$1CP1255\$1CS\$1AI Hebrew\$1CI\$1AS Hebrew\$1CI\$1AI  | 
|  일본어(Babelfish 2.1.0 이상)  | Japanese\$1CS\$1AS | Japanese\$1CI\$1AI Japanese\$1CI\$1AS | 
|  한국어\$1완성형  |  Korean\$1Wamsung\$1CS\$1AS  |  Korean\$1Wamsung\$1CI\$1AS Korean\$1Wamsung\$1CI\$1AI  | 
|  코드 페이지 CP1252의 라틴 문자  |  latin1\$1general\$1cs\$1as BBF\$1Unicode\$1General\$1CS\$1AS BBF\$1Unicode\$1General\$1Pref\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1\$1CS\$1AS BBF\$1Unicode\$1CP1\$1CS\$1AS  |  latin1\$1general\$1ci\$1as latin1\$1general\$1ci\$1ai latin1\$1general\$1cs\$1ai BBF\$1Unicode\$1General\$1CI\$1AI BBF\$1Unicode\$1General\$1CS\$1AI BBF\$1Unicode\$1CP1\$1CI\$1AI BBF\$1Unicode\$1CP1\$1CS\$1AI  | 
|  현대 그리스어  |  BBF\$1Unicode\$1CP1253\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1253\$1CS\$1AS  |  BBF\$1Unicode\$1CP1253\$1CI\$1AI BBF\$1Unicode\$1CP1253\$1CS\$1AI  | 
|  현대\$1스페인어  |  Modern\$1Spanish\$1CS\$1AS  |  Modern\$1Spanish\$1CI\$1AS Modern\$1Spanish\$1CI\$1AI  | 
|  몽골어  |  Mongolian\$1CS\$1AS  |  Mongolian\$1CI\$1AS Mongolian\$1CI\$1AI  | 
|  폴란드어  |  Polish\$1CS\$1AS  |  Polish\$1CI\$1AS Polish\$1CI\$1AI  | 
|  태국어  |  BBF\$1Unicode\$1CP874\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP874\$1CS\$1AS Thai\$1CS\$1AS  |  BBF\$1Unicode\$1CP874\$1CI\$1AI BBF\$1Unicode\$1CP874\$1CS\$1AI Thai\$1CI\$1AS, Thai\$1CI\$1AI  | 
|  정통\$1스페인어  |  Traditional\$1Spanish\$1CS\$1AS  |  Traditional\$1Spanish\$1CI\$1AS Traditional\$1Spanish\$1CI\$1AI  | 
|  터키어  |  BBF\$1Unicode\$1CP1254\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1254\$1CS\$1AS Turkish\$1CS\$1AS  |  BBF\$1Unicode\$1CP1254\$1CI\$1AI BBF\$1Unicode\$1CP1254\$1CS\$1AI Turkish\$1CI\$1AS, Turkish\$1CI\$1AI  | 
|  우크라이나어  |  Ukranian\$1CS\$1AS  |  Ukranian\$1CI\$1AS Ukranian\$1CI\$1AI  | 
|  베트남어  |  BBF\$1Unicode\$1CP1258\$1CS\$1AS BBF\$1Unicode\$1Pref\$1CP1258\$1CS\$1AS Vietnamese\$1CS\$1AS  |  BBF\$1Unicode\$1CP1258\$1CI\$1AI BBF\$1Unicode\$1CP1258\$1CS\$1AI Vietnamese\$1CI\$1AS Vietnamese\$1CI\$1AI  | 

## Babelfish의 기본 데이터 정렬 동작
<a name="babelfish-collations-default"></a>

이전에는 `pg_catalog.default`가 정렬 가능한 데이터 형식의 기본 데이터 정렬이었습니다. 이러한 데이터 형식에 의존하는 데이터 형식 및 객체는 대/소문자 구분 데이터 정렬을 따릅니다. 이 조건은 대소문자를 구분하지 않는 데이터 정렬을 따르는 데이터 세트의 T-SQL 객체에 잠재적으로 영향을 미칩니다. Babelfish 2.3.0부터 정렬 가능한 데이터 형식(TEXT 및 NTEXT 제외)의 기본 데이터 정렬은 `babelfishpg_tsql.server_collation_name` 파라미터의 데이터 정렬과 동일합니다. Babelfish 2.3.0으로 업그레이드하면 DB 클러스터 생성 시 기본 데이터 정렬이 자동으로 선택되므로 눈에 띄는 영향이 없습니다.

# 데이터 정렬 관리
<a name="collation.managing"></a>

ICU 라이브러리는 데이터 정렬 버전 추적을 제공하여 새 버전의 ICU를 사용할 수 있으면 데이터 정렬에 종속된 인덱스를 다시 인덱싱할 수 있도록 합니다. 현재 데이터베이스에 새로 고침이 필요한 데이터 정렬이 있는지 확인하려면 `psql` 또는 `pgAdmin`을 사용하여 연결한 후 다음 쿼리를 활용합니다.

```
SELECT pg_describe_object(refclassid, refobjid,
    refobjsubid) AS "Collation", 
    pg_describe_object(classid, objid, objsubid) AS "Object" 
    FROM pg_depend d JOIN pg_collation c ON refclassid = 'pg_collation'::regclass
    AND refobjid = c.oid WHERE c.collversion <> pg_collation_actual_version(c.oid) 
    ORDER BY 1, 2;
```

이 쿼리는 다음과 같은 출력을 반환합니다.

```
 Collation | Object
-----------+--------
(0 rows)
```

이 예에서는 데이터 정렬을 업데이트할 필요가 없습니다.

Babelfish 데이터베이스에서 미리 정의된 데이터 정렬 목록을 확인하려면 다음 쿼리와 함께 `psql` 또는 `pgAdmin`을 사용하면 됩니다.

```
SELECT * FROM pg_collation;
```

미리 정의된 데이터 정렬은 `sys.fn_helpcollations` 테이블에 저장됩니다. 다음 명령을 사용하여 데이터 정렬에 대한 정보(예: lcid, style 및 collate flags)를 표시할 수 있습니다. `sqlcmd`를 사용하여 모든 데이터 정렬 목록을 가져오려면 T-SQL 포트(기본값 1433)에 연결하고 다음 쿼리를 실행합니다.

```
1> :setvar SQLCMDMAXVARTYPEWIDTH 40
2> :setvar SQLCMDMAXFIXEDTYPEWIDTH 40
3> SELECT * FROM fn_helpcollations()
4> GO
name                                     description
---------------------------------------- ----------------------------------------
arabic_cs_as                             Arabic, case-sensitive, accent-sensitive
arabic_ci_ai                             Arabic, case-insensitive, accent-insensi
arabic_ci_as                             Arabic, case-insensitive, accent-sensiti
bbf_unicode_bin2                         Unicode-General, case-sensitive, accent-
bbf_unicode_cp1250_ci_ai                 Default locale, code page 1250, case-ins
bbf_unicode_cp1250_ci_as                 Default locale, code page 1250, case-ins
bbf_unicode_cp1250_cs_ai                 Default locale, code page 1250, case-sen
bbf_unicode_cp1250_cs_as                 Default locale, code page 1250, case-sen
bbf_unicode_pref_cp1250_cs_as            Default locale, code page 1250, case-sen
bbf_unicode_cp1251_ci_ai                 Default locale, code page 1251, case-ins
bbf_unicode_cp1251_ci_as                 Default locale, code page 1251, case-ins
bbf_unicode_cp1254_ci_ai                 Default locale, code page 1254, case-ins
...
(124 rows affected)
```

이 예에 표시된 1행과 2행은 문서 가독성을 위해 출력 범위를 좁혔습니다.

```
1> SELECT SERVERPROPERTY('COLLATION')
2> GO
serverproperty
---------------------------------------------------------------------------
sql_latin1_general_cp1_ci_as

(1 rows affected)
1>
```

# 데이터 정렬 제한 및 동작 차이점
<a name="collation.limitations"></a>

Babelfish는 데이터 정렬 지원을 위해 ICU 라이브러리를 사용합니다. PostgreSQL은 특정 버전의 ICU로 빌드되며 최대 한 버전의 데이터 정렬을 일치시킬 수 있습니다. 시간이 흐름에 따라 언어가 발전하면서 사소한 변형이 있는 것처럼 버전 간 변형은 피할 수 없습니다. 다음 목록에는 Babelfish 데이터 정렬의 알려진 제한 사항 및 동작 변형이 나와 있습니다.
+ **인덱스 및 데이터 정렬 유형 종속성** – International Components for Unicode(ICU) 데이터 정렬 라이브러리(Babelfish에서 사용하는 라이브러리)를 따르는 사용자 지정 유형의 인덱스는 라이브러리 버전이 변경되어도 무효화되지 않습니다.
+ **COLLATIONPROPERTY 함수** – 데이터 정렬 속성은 지원되는 Babelfish BBF 데이터 정렬에 대해서만 구현됩니다. 자세한 내용은 [Babelfish supported collations table](babelfish-collations.md#bfish-collations-table)을 참조하세요.
+ **유니코드 정렬 규칙 차이점** - SQL Server의 SQL 데이터 정렬은 유니코드로 인코딩된 데이터(`nchar` 및 `nvarchar`)를 유니코드로 인코딩되지 않은 데이터(`char` 및 `varchar`)와 다르게 정렬합니다. Babelfish 데이터베이스는 항상 UTF-8으로 인코딩되며, `char` 또는 `varchar`에 대한 정렬 순서가 `nchar` 또는 `nvarchar`에 대한 정렬 순서와 같도록 데이터 유형에 관계없이 항상 유니코드 정렬 규칙을 일관되게 적용합니다.
+ **2차와 동일한 데이터 정렬 및 정렬 동작** – 기본 ICU 유니코드 2차와 동일한(`CI_AS`) 데이터 정렬은 문장 부호 및 기타 영숫자가 아닌 문자를 숫자 문자 앞에 정렬하고 숫자 문자는 알파벳 문자 앞에 정렬합니다. 그러나 문장 부호 및 기타 특수 문자의 순서는 다릅니다.
+ **3차 데이터 정렬, ORDER BY용 차선책** – SQL 데이터 정렬(예: `SQL_Latin1_General_Pref_CP1_CI_AS`)은 `TERTIARY_WEIGHTS` 함수 및 `CI_AS` 데이터 정렬에서 균등하게 비교되는 문자열을 정렬하는 기능을 지원하여 `ABC`, `ABc`, `AbC`, `Abc`, `aBC`, `aBc`, `abC`, `abc`와 같이 먼저 대문자로 정렬되도록 합니다. 따라서 `DENSE_RANK OVER (ORDER BY column)` 분석 함수는 이러한 문자열을 동일한 순위를 갖는 것으로 평가하지만 파티션 내에서 먼저 대문자를 정렬합니다.

  `COLLATE` 절을 `@colCaseFirst=upper`를 지정하는 3차 `CS_AS` 데이터 정렬을 지정하는 `ORDER BY` 절에 추가하여 Babelfish와 비슷한 결과를 얻을 수 있습니다. 그러나 `colCaseFirst` 한정자는 `CI_AS` 데이터 정렬과 같이 2차와 동일한 문자열이 아닌 3차와 동일한 문자열에만 적용됩니다. 따라서 단일 ICU 데이터 정렬을 사용하여 3차 SQL 데이터 정렬을 에뮬레이션할 수 없습니다.

  해결 방법으로 먼저 `BBF_SQL_Latin1_General_CP1_CI_AS` 데이터 정렬을 사용하려면 `SQL_Latin1_General_Pref_CP1_CI_AS` 데이터 정렬을 사용하는 애플리케이션을 수정하는 것이 좋습니다. 그런 다음, `COLLATE BBF_SQL_Latin1_General_Pref_CP1_CS_AS`를 이 열의 `ORDER BY` 절에 추가합니다.
+ **문자 확장** – 문자 확장은 단일 문자를 기본 수준의 문자 시퀀스와 동일하게 취급합니다. SQL Server의 기본 `CI_AS` 데이터 정렬은 문자 확장을 지원합니다. ICU 데이터 정렬은 악센트를 구분하지 않는 데이터 정렬에 대해서만 문자 확장을 지원합니다.

  문자 확장이 필요한 경우 비교를 위해 `AI` 데이터 정렬을 사용합니다. 그러나 이러한 데이터 정렬은 현재 LIKE 연산자에서 지원되지 않습니다.
+ **char 및 varchar 인코딩** – SQL 데이터 정렬이 `char` 또는 `varchar` 데이터 유형에 사용되는 경우 ASCII 127 이전 문자의 정렬 순서는 해당 SQL 데이터 정렬에 대한 특정 코드 페이지에 따라 결정됩니다. SQL 데이터 정렬의 경우 `char` 또는 `varchar`로 선언된 문자열은 `nchar` 또는 `nvarchar`로 선언된 문자열과 다르게 정렬될 수 있습니다.

  PostgreSQL은 데이터베이스 인코딩으로 모든 문자열을 인코딩하므로 모든 문자를 UTF-8으로 변환하고 유니코드 규칙을 사용하여 정렬합니다.

  SQL 데이터 정렬은 유니코드 규칙을 사용하여 nchar 및 nvarchar 데이터 유형을 정렬하므로 Babelfish는 UTF-8을 사용하여 서버의 모든 문자열을 인코딩합니다. Babelfish는 유니코드 규칙을 사용하여 char 및 varchar 문자열을 정렬하는 것과 동일한 방식으로 nchar 및 nvarchar 문자열을 정렬합니다.
+ **보조 문자** – SQL Server 함수 `NCHAR`, `UNICODE`, `LEN`은 유니코드 기본 다국어 평면(BMP) 외부의 코드 포인트에 대한 문자를 지원합니다. 대조적으로 SC가 아닌 데이터 정렬은 서로게이트 쌍 문자를 사용하여 보조 문자를 처리합니다. 유니코드 데이터 형식의 경우 SQL Server는 UCS-2 또는 보조 문자를 사용하는 경우 전체 유니코드 범위(1,114,114자)를 사용하여 최대 65,535자를 나타낼 수 있습니다.
+ **가나 구분(KS) 데이터 정렬** - 가나 구분(KS) 데이터 정렬은 `Hiragana` 및 `Katakana` 일본어 가나 문자를 다르게 취급합니다. ICU는 일본 데이터 정렬 표준 `JIS X 4061`을 지원합니다. 이제 사용되지 않는 `colhiraganaQ [on | off]` 로캘 한정자는 KS 데이터 정렬과 동일한 기능을 제공할 수 있습니다. 그러나 SQL Server와 동일한 이름의 KS 데이터 정렬은 현재 Babelfish에서 지원하지 않습니다.
+ **전자/반자 구분(WS) 데이터 정렬** – 싱글바이트 문자(반자)와 더블바이트 문자(전자)로 표현되는 동일한 문자가 다르게 처리되는 경우의 데이터 정렬을 *전자/반자 구분(WS)*이라고 합니다. 그러나 SQL Server와 동일한 이름의 WS 데이터 정렬은 현재 Babelfish에서 지원하지 않습니다.
+ **변형 선택기 구분(VSS) 데이터 정렬** - 변형 선택기 구분(VSS) 데이터 정렬은 일본어 데이터 정렬 `Japanese_Bushu_Kakusu_140` 및 `Japanese_XJIS_140`에서 표의 문자 변형 선택기를 구분합니다. 변형 시퀀스는 기본 문자와 추가 변형 선택기로 구성됩니다. `_VSS` 옵션을 선택하지 않은 경우 변형 선택기는 비교 시 고려되지 않습니다.

  VSS 데이터 정렬은 현재 Babelfish에서 지원되지 않습니다.
+ **BIN 및 BIN2 데이터 정렬** – BIN2 데이터 정렬은 코드 포인트 순서에 따라 문자를 정렬합니다. UTF-8의 바이트별 이진 순서는 유니코드 코드 포인트 순서를 준수하므로 가장 성능이 좋은 데이터 정렬이 될 수 있습니다. 유니코드 코드 포인트 순서가 애플리케이션에서 작동하는 경우 BIN2 데이터 정렬을 사용하는 것이 좋습니다. 그러나 BIN2 데이터 정렬을 사용하면 문화적으로 예상치 못한 순서로 데이터가 클라이언트에 표시될 수 있습니다. 시간이 진행되면서 소문자에 대한 새로운 매핑이 유니코드에 추가되므로 `LOWER` 함수는 ICU의 다른 버전에서 다르게 수행될 수 있습니다. 이 경우는 BIN2 데이터 정렬과 관련된 문제가 아닌 좀 더 일반적인 데이터 정렬 버전 관리 문제의 특별한 경우입니다.

  Babelfish는 Babelfish 배포를 통해 `BBF_Latin1_General_BIN2` 데이터 정렬을 제공하여 유니코드 코드 포인트 순서로 정렬합니다. BIN 데이터 정렬에서는 첫 번째 문자만 wchar로 정렬됩니다. 나머지 문자는 해당 인코딩에 따라 코드 포인트 순서로 바이트별 정렬이 효과적으로 이뤄집니다. 이 방법은 유니코드 데이터 정렬 규칙을 따르지 않으며 Babelfish에서 지원하지 않습니다.
+ **비결정적 데이터 정렬 및 CHARINDEX 제한** - 버전 2.1.0 이전 Babelfish 릴리스의 경우 CHARINDEX를 비결정적 데이터 정렬과 함께 사용할 수 없습니다. 기본적으로 Babelfish는 대소문자를 구분하지 않는(비결정적) 데이터 정렬을 사용합니다. 이전 버전의 Babelfish에 CHARINDEX를 사용하면 다음과 같은 런타임 오류가 발생합니다.

  ```
  nondeterministic collations are not supported for substring searches
  ```
**참고**  
이 제한 사항 및 해결 방법은 Babelfish 버전 1.x(Aurora PostgreSQL 13.x 버전)에만 적용됩니다. Babelfish 2.1.0 이상 릴리스에는 문제가 발생하지 않습니다.

  이 문제를 해결하려면 다음 중 한 방법을 시도하면 됩니다.
  + 표현식을 대소문자를 구분하는 데이터 정렬로 명시적으로 변환하고 LOWER 또는 UPPER를 적용하여 두 인수를 모두 케이스 폴드(case-fold)합니다. 예를 들어 `SELECT charindex('x', a) FROM t1`은 다음이 됩니다.

    ```
    SELECT charindex(LOWER('x'), LOWER(a COLLATE sql_latin1_general_cp1_cs_as)) FROM t1
    ```
  + SQL 함수 f\$1charindex를 만들고 CHARINDEX 호출을 다음 함수에 대한 호출로 바꿉니다.

    ```
    CREATE function f_charindex(@s1 varchar(max), @s2 varchar(max)) RETURNS int
    AS
    BEGIN
    declare @i int = 1
    WHILE len(@s2) >= len(@s1)
    BEGIN
      if LOWER(@s1) = LOWER(substring(@s2,1,len(@s1))) return @i
      set @i += 1
      set @s2 = substring(@s2,2,999999999)
    END
    return 0
    END
    go
    ```