10.4.4.1 LDML 구문을 사용한 UCA 데이터 정렬의 정의
MySQL을 다시 컴파일하지 않고 Unicode 캐릭터 세트의 UCA 데이터 정렬을 추가하려면 다음 단계를 사용합니다. 데이터 정렬의 정렬 특성을 설명하는데 사용하는 LDML 규칙을 파악하지 않으면 섹션 10.4.4.2 "MySQL에서 지원되는 LDML 구문" 을 참조하십시오.
이 예에서는 utf8_phone_ci
라는 데이터 정렬을 utf8
문자 집합을 추가합니다. 이 데이터 정렬은 사용자가 이름과 전화 번호를 게시하는 Web 어플리케이션에 관련한 시나리오 용으로 설계되어 있습니다. 전화 번호는 다음과 같은 다양한 형식으로 지정할 수 있습니다.
+ 7-12345-67 + 7-12-345-67 +7 12 345 67 +7 (12) 345 67 +71234567
이러한 값을 처리 할 때 발생하는 문제는 다양한 형식이 허용되는 것으로, 특정 전화 번호의 검색이 매우 어려울 것입니다. 이 해결책은 구두점 문자를 정렬 무시할 수 있도록하는 새로운 데이터 정렬을 정의합니다.
섹션 10.4.2 "데이터 정렬 ID의 선택" 에서 설명한 바와 같이, 데이터 정렬 ID를 선택합니다. 다음 단계에서는 1029의 ID를 사용합니다.
Index.xml
구성 파일을 변경합니다. 이 파일은character_sets_dir
시스템 변수에 의해 이름이 붙은 디렉토리에 있습니다. 사용하는 시스템에서는 경로가 다를 수 있지만, 다음과 같이 변수 값을 확인할 수 있습니다.mysql>
SHOW VARIABLES LIKE 'character_sets_dir';
+--------------------+-----------------------------------------+ | Variable_name | Value | +--------------------+-----------------------------------------+ | character_sets_dir | /user/local/mysql/share/mysql/charsets/ | +--------------------+-----------------------------------------+데이터 정렬 이름을 선택하고
Index.xml
파일에 표시합니다. 또한 데이터 정렬 순서 규칙을 제공해야합니다. 데이터 정렬을 추가 문자 집합의<charset>
요소를 찾고, 데이터 정렬 이름과 ID를 지정하는<collation>
요소를 추가하여 이름을 ID와 연결합니다.<collation>
요소 내에서 정렬 규칙을 포함하는<rules>
요소를 제공합니다.<charset name = "utf8"> ... <collation name = "utf8_phone_ci"id = "1029"> <rules> <reset> \ u0000 </ reset> <i> \ u0020 </ i> <! - space -> <i> \ u0028 </ i> <! - left parenthesis -> <i> \ u0029 </ i> <! - right parenthesis -> <i> \ u002B </ i> <! - plus -> <i> \ u002D </ i> <! - hyphen -> </ rules> </ collation> ... </ charset>
기타 Unicode 문자 세트에 동일한 데이터 정렬이 필요한 경우는 다른
<collation>
요소를 추가합니다. 예를 들어,ucs2_phone_ci
을 정의하려면<collation>
요소를<charset name="ucs2">
요소에 추가합니다. 각각의 데이터 정렬은 고유의 독자적인 ID가 필요합니다.서버를 다시 시작하고이 문을 사용하여 데이터 정렬 여부를 확인합니다.
mysql>
SHOW COLLATION LIKE 'utf8_phone_ci';
+---------------+---------+------+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +---------------+---------+------+---------+----------+---------+ | utf8_phone_ci | utf8 | 1029 | | | 8 | +---------------+---------+------+---------+----------+---------+
다음 데이터 정렬을 테스트하여 원하는 특성이 있는지 확인합니다.
새로운 데이터 정렬을 사용하여 몇 가지 샘플 전화 번호를 포함하는 테이블을 만듭니다.
mysql>CREATE TABLE phonebook (
->name VARCHAR(64),
->phone VARCHAR(64) CHARACTER SET utf8 COLLATE utf8_phone_ci
->);
Query OK, 0 rows affected (0.09 sec) mysql>INSERT INTO phonebook VALUES ('Svoj','+7 912 800 80 02');
Query OK, 1 row affected (0.00 sec) mysql>INSERT INTO phonebook VALUES ('Hf','+7 (912) 800 80 04');
Query OK, 1 row affected (0.00 sec) mysql>INSERT INTO phonebook VALUES ('Bar','+7-912-800-80-01');
Query OK, 1 row affected (0.00 sec) mysql>INSERT INTO phonebook VALUES ('Ramil','(7912) 800 80 03');
Query OK, 1 row affected (0.00 sec) mysql>INSERT INTO phonebook VALUES ('Sanja','+380 (912) 8008005');
Query OK, 1 row affected (0.00 sec)
일부 쿼리를 실행하여 무시 된 구두점 문자가 실제로 정렬 및 비교에서 무시되어 있는지 확인합니다.
mysql>SELECT * FROM phonebook ORDER BY phone;
+-------+--------------------+ | name | phone | +-------+--------------------+ | Sanja | +380 (912) 8008005 | | Bar | +7-912-800-80-01 | | Svoj | +7 912 800 80 02 | | Ramil | (7912) 800 80 03 | | Hf | +7 (912) 800 80 04 | +-------+--------------------+ 5 rows in set (0.00 sec) mysql>SELECT * FROM phonebook WHERE phone='+7(912)800-80-01';
+------+------------------+ | name | phone | +------+------------------+ | Bar | +7-912-800-80-01 | +------+------------------+ 1 row in set (0.00 sec) mysql>SELECT * FROM phonebook WHERE phone='79128008001';
+------+------------------+ | name | phone | +------+------------------+ | Bar | +7-912-800-80-01 | +------+------------------+ 1 row in set (0.00 sec) mysql>SELECT * FROM phonebook WHERE phone='7 9 1 2 8 0 0 8 0 0 1';
+------+------------------+ | name | phone | +------+------------------+ | Bar | +7-912-800-80-01 | +------+------------------+ 1 row in set (0.00 sec)