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
사용)는 대소 문자를 구분합니다. 다른 비교 구분하지 않습니다.