• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 1. 문자 세트 지원
    1. 일반 문자 집합 및 데이터 정렬
    2. MySQL에서의 문자 셋과 콜레션
    3. 문자 셋과 콜레션 지정
    4. 연결 문자 집합 및 데이터 정렬
    5. 응용 프로그램의 문자 집합 및 정렬 순서 구성
    6. 오류 메시지의 문자 세트
    7. 데이터 정렬 문제
    1. 데이터 정렬 이름
    2. SQL문에서 COLLATE 사용
    3. COLLATE 절 우선 순위
    4. 데이터 정렬과 문자 집합의 적절한 대응
    5. 식의 데이터 정렬
    6. _bin 및 binary 데이터 정렬
    7. BINARY 연산자
    8. 데이터 정렬의 효과의 예
    9. 데이터 정렬과 INFORMATION_SCHEMA 검색
    8. 문자열의 레퍼토리
    9. 문자 세트 지원의 영향을받는 연산
    10. Unicode 지원
    11. 이전 Unicode 지원에서 현재 Unicode 지원으로 업그레이드
    12. 메타 데이터에 UTF-8
    13. 컬럼 문자 집합 변환
    14. MySQL에서 지원되는 문자셋과 콜레션
    2. 오류 메시지 언어 설정
    3. 문자 세트 추가
    4. 문자 세트에 데이터 정렬 추가
    5. 문자 세트 구성
    6. MySQL Server에서 시간대 지원
    7. MySQL Server의 로케일 지원
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

10.1.7.9 데이터 정렬과 INFORMATION_SCHEMA 검색

INFORMATION_SCHEMA 테이블에서 문자열 컬럼은 utf8_general_ci 데이터 정렬이 있고 이것은 대소 문자를 구별하지 않습니다. 그러나 INFORMATION_SCHEMA 문자열 컬럼에서의 검색은 파일 시스템에서 대소 문자 구별도 영향을줍니다. 데이터베이스 및 테이블의 이름 등 파일 시스템에서 나타나는 객체에 대응하는 값은 파일 시스템에서 대소 문자를 구별하는 경우 검색에서 대소 문자를 구별 될 수 있습니다. 이 섹션에서는 필요에 따라이 문제를 해결하는 방법을 설명합니다. Bug # 34921를 참조하십시오.

쿼리에서 test 데이터베이스에 SCHEMATA.SCHEMA_NAME 컬럼을 검색합니다. Linux에서는 파일 시스템에서 대소 문자를 구분하므로 SCHEMATA.SCHEMA_NAME 의 'test' 와 비교는 일치하지만 'TEST' 과의 비교는 일치하지 않습니다.

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+
1 row in set (0.01 sec)

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME = 'TEST';
Empty set (0.00 sec)

Windows 또는 OS X에서는 파일 시스템에서 대소 문자를 구별하지 않기 때문에 비교는 'test' 와 'TEST' 모두 일치합니다.

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME = 'TEST';
+-------------+
| SCHEMA_NAME |
+-------------+
| TEST        |
+-------------+
1 row in set (0.00 sec)

lower_case_table_names 시스템 변수의 값은 이러한 맥락에서 차이를 가져 오지 않습니다.

파일 시스템에서 데이터베이스 개체를 검색 할 때 INFORMATION_SCHEMA 쿼리 utf8_general_ci 데이터 정렬이 사용되지 않기 때문에 이러한 작업을 수행합니다. 이것은 MySQL에서 INFORMATION_SCHEMA 검색에 구현 된 최적화의 결과입니다. 이러한 최적화 자세한 내용은 섹션 8.2.4 "INFORMATION_SCHEMA 쿼리 최적화" 를 참조하십시오.

INFORMATION_SCHEMA 는 "가상"데이터베이스이며, 파일 시스템에는 나타나지 않기 때문에, INFORMATION_SCHEMA 문자열 컬럼에서 INFORMATION_SCHEMA 자체를 참조하는 값을 검색하는 경우 utf8_general_ci 데이터 정렬을 사용합니다. 예를 들어, SCHEMATA.SCHEMA_NAME 과의 비교는 플랫폼에 관계없이 'information_schema' 또는 'INFORMATION_SCHEMA' 에 일치합니다.

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME = 'information_schema';
+--------------------+
| SCHEMA_NAME        |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME = 'INFORMATION_SCHEMA';
+--------------------+
| SCHEMA_NAME        |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.00 sec)

INFORMATION_SCHEMA 열에서 문자열 연산의 결과가 예상과 다를 경우 해결 방법은 명시적인 COLLATE 절을 사용하여 적절한 데이터 정렬을 강제로 사용하는 것입니다 ( 섹션 10.1.7.2 "SQL 문 의 COLLATE 사용 " ). 예를 들어, 대문자와 소문자를 구별하지 않고 검색을 실행하려면 INFORMATION_SCHEMA 열 명과 함께 COLLATE 를 사용합니다.

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'test';
+-------------+
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+
1 row in set (0.00 sec)

mysql> SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
    -> WHERE SCHEMA_NAME COLLATE utf8_general_ci = 'TEST';
| SCHEMA_NAME |
+-------------+
| test        |
+-------------+
1 row in set (0.00 sec)

UPPER() 또는 LOWER() 함수를 사용할 수도 있습니다.

 WHERE UPPER (SCHEMA_NAME) = 'TEST'
 WHERE LOWER (SCHEMA_NAME) = 'test'

대소 문자를 구분하는 파일 시스템의 플랫폼에서도 대소 문자를 구별하지 않는 비교를 수행 할 수 있지만, 전술 한 바와 같이 반드시 항상 올바른 처리된다고는 할 수 없습니다. 이러한 플랫폼에서는 대소 문자 만 다른 이름의 여러 오브젝트가있을 수 있습니다. 예를 들어, city , CITY 및 City 라는 테이블이 동시에 존재하는 것이 가능합니다. 검색에서 이러한 모든 이름과 일치하거나 하나만 일치하는지 검토하고 그에 따라 쿼리를 만듭니다.

 WHERE TABLE_NAME COLLATE utf8_bin = 'City'
 WHERE TABLE_NAME COLLATE utf8_general_ci = 'city'
 WHERE UPPER (TABLE_NAME) = 'CITY'
 WHERE LOWER (TABLE_NAME) = 'city'

이들 중 첫 번째 비교 ( utf8_bin 사용)는 대소 문자를 구분합니다. 다른 비교 구분하지 않습니다.

서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved