9.2.2 식별자의 대문자와 소문자의 구별
MySQL에서 데이터베이스는 데이터 디렉토리의 디렉토리에 대응하고 있습니다. 데이터베이스의 각 테이블은 데이터베이스 디렉토리에있는 하나 (스토리지 엔진에 따라 그 이상)의 파일에 대응하고 있습니다. 트리거도 파일을 지원하고 있습니다. 따라서 기본 운영 체제에서 대소 문자를 구별 될지 여부가 데이터베이스 이름, 테이블 이름 및 트리거 이름에서 대소 문자를 구별 될지 여부에 영향을줍니다. 이것은 Windows에서이 이름은 대소 문자를 구분하지 않지만 많은 Unix에서는 대문자와 소문자가 구별되는 것을 의미합니다. 그러나주의해야 할 예외의 하나에 OS X가 있습니다. OS X은 Unix를 기반으로하지만, 대문자와 소문자가 구별되지 않는 기본 파일 시스템 유형 (HFS +)를 사용합니다. 그러나 OS X는 UFS 볼륨도 지원하고 있습니다. UFS 볼륨에서는 Unix의 경우와 마찬가지로 대소 문자를 구분합니다. 섹션 1.8.1 "표준 SQL에 대한 MySQL 확장 기능" 을 참조하십시오. 이 섹션에서는 후술하는 바와 같이, lower_case_table_names
시스템 변수는 서버가 식별자의 대문자와 소문자를 어떻게 처리할지에 영향을줍니다.
일부 플랫폼에서는 데이터베이스 이름, 테이블 이름 및 트리거 이름에서 대소 문자를 구분하지 않지만 이러한 이름 중 하나를 참조하는데 같은 문에서 대소 문자가 다른 이름을 사용 하지 마십시오. 다음 문은 같은 테이블을 my_table
및 MY_TABLE
로 참조하기 때문에 작동하지 않습니다.
mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;
컬럼 명, 인덱스 명, 스토어드 루틴 이름 및 이벤트 이름은 모든 플랫폼에서 대소 문자를 구분하지 않습니다. 칼럼 별칭도 마찬가지입니다.
그러나 로그 파일 그룹의 이름은 대소 문자를 구분됩니다. 이것은 표준 SQL과는 다릅니다.
기본적으로 Unix에서는 테이블의 별칭은 대소 문자를 구별되지만 Windows 또는 OS X에서는 구분하지 않습니다. Unix에서는 다음 문은 별칭을 a
와 A
모두에서 참조하고 있기 때문에 작동하지 않습니다.
mysql>SELECT
->col_name
FROMtbl_name
AS aWHERE a.
col_name
= 1 OR A.col_name
= 2;
하지만 Windows에서는이 같은 문이 허용됩니다. 이러한 차이에서 발생하는 문제를 해결하기 위해 데이터베이스 및 테이블 만들기 및 참조는 항상 소문자 이름을 사용하는 등 일관된 규칙을 두는 것이 좋습니다. 이 규칙은 이동성과 사용 편의성을 극대화하기 위해 권장되고 있습니다.
테이블 또는 데이터베이스 이름이 어떻게 디스크에 저장되어 MySQL에서 사용되는지는 lower_case_table_names
시스템 변수의 영향을받습니다. 이 시스템 변수는 mysqld를 시작할 때 설정할 수 있습니다. lower_case_table_names
다음 표의 값을 설정할 수 있습니다. 이 변수는 트리거 식별자의 대문자와 소문자의 구별에는 영향을 미치지 않습니다. Unix에서는 lower_case_table_names
의 기본값은 0입니다. Windows에서는 기본값은 1입니다. OS X에서는 기본값은 2입니다.
값 | 의미 |
---|---|
0 | 테이블 및 데이터베이스 이름은 CREATE TABLE 또는 CREATE DATABASE 문에 지정된 대소 문자를 사용하여 디스크에 저장됩니다. 이름 비교는 대소 문자를 구분합니다. 대소 문자를 구별하지 않는 파일 이름을 가진 시스템 (Windows와 OS X)에서 MySQL을 실행하려면이 변수를 0으로 설정하지 마십시오. 대문자와 소문자를 구별하지 않는 파일 시스템에서 --lower-case-table-names=0 을 사용하여 강제로이 변수를 0으로 설정하고, 대문자와 소문자를 바꿔 MyISAM 테이블 이름에 액세스하는 경우 인덱스 가 손상 될 수 있습니다. |
1 | 테이블 이름은 디스크에 소문자로 저장되고 이름 비교는 대소 문자를 구분하지 않습니다. MySQL은 저장 및 조회시 모든 테이블 이름을 소문자로 변환됩니다. 이 동작은 데이터베이스 이름과 테이블 별칭에도 적용됩니다. |
2 | 테이블 및 데이터베이스 이름은 CREATE TABLE 또는 CREATE DATABASE 문에 지정된 대소 문자를 사용하여 디스크에 저장되지만, MySQL은 조회시 소문자로 변환됩니다. 이름 비교는 대소 문자를 구분하지 않습니다. 이것은 대문자와 소문자가 구별되지 않는 파일 시스템에서만 작동합니다. InnoDB 테이블 이름은 lower_case_table_names=1 처럼 소문자로 저장됩니다. |
MySQL을 하나의 플랫폼에서만 사용하는 경우는 일반적으로 lower_case_table_names
변수를 기본값에서 변경할 필요가 없습니다. 그러나 파일 시스템의 대소 문자 구별이 다른 플랫폼간에 테이블을 전송하는 경우 문제가 발생할 수 있습니다. 예를 들어, Unix에서는 my_table
과 MY_TABLE
라는 다른 두 테이블을 사용할 수 있지만 Windows에서 이들은 동일한 것으로 간주됩니다. 데이터베이스 이름과 테이블 이름의 대소 문자 구별로 인해 발생하는 데이터 전송 문제를 해결하려면 다음 두 가지 옵션이 있습니다.
lower_case_table_names=1
을 전체 시스템에서 사용하십시오. 이것의 주요 단점은SHOW TABLES
또는SHOW DATABASES
를 사용하면 원래 대문자 또는 소문자로 이름이 표시되지 않을 것입니다.Unix에서는
lower_case_table_names=0
을 Windows에서lower_case_table_names=2
를 사용하십시오. 이제 데이터베이스와 테이블 이름의 대소 문자 구별이 유지됩니다. 이 단점은 사용자 문이 Windows에서 올바른 대문자 또는 소문자로 데이터베이스 및 테이블 이름을 항상 참조하는지 확인해야하는 것입니다. 대소 문자를 구분 Unix에 문을 전송하는 경우 대소 문자가 올바르지 않으면이 문은 작동하지 않습니다.예외 :
InnoDB
테이블을 사용하는 경우, 데이터 전송과 관련된 이러한 문제를 방지하려면 모든 플랫폼에서lower_case_table_names
를 1로 설정하여 강제로 이름이 소문자로 변환되도록하십시오 .
Unix에서 lower_case_table_names
시스템 변수를 1로 설정하려면 먼저 이전 데이터베이스와 테이블 이름을 소문자로 변환 한 후 mysqld를 중지하고 새 변수 설정으로 재시작해야합니다. 각 테이블에 대해 이렇게에는 RENAME TABLE
을 사용합니다.
RENAME TABLE T1 TO t1;
하나 이상의 데이터베이스 전체를 변환하려면 lower_case_table_names
의 설정 전에 이러한 덤프 한 다음 데이터베이스를 삭제하고 lower_case_table_names
설정 한 후에는이를 다시로드합니다.
mysqldump를 사용하여 각 데이터베이스를 덤프합니다.
mysqldump --databases db1> db1.sql mysqldump --databases db2> db2.sql ...
다시 작성해야하는 데이터베이스에 대해 작업을 수행합니다.
DROP DATABASE
를 사용하여 각 데이터베이스를 삭제합니다.서버를 중지하고
lower_case_table_names
을 설정하고 서버를 다시 시작합니다.데이터베이스마다 덤프 파일을 다시로드합니다.
lower_case_table_names
이 설정되어 있기 때문에 각각의 데이터베이스와 테이블 이름은 다시 생성 될 때 소문자로 변환됩니다.mysql <db1.sql mysql <db2.sql ...
이진 데이터 정렬에 따라 대문자 형식이 동등한 경우 개체 이름은 복제로 간주 될 수 있습니다. 이것은 커서 조건, 프로 시저, 함수, 세이브 포인트 스토어드 루틴 파라미터 저장 프로그램 로컬 변수 및 플러그인의 이름에도 적용됩니다. 열, 제약 조건 데이터베이스 파티션, PREPARE
를 사용하여 준비된 문, 테이블, 트리거, 사용자 및 사용자 정의 변수 이름에는 적용되지 않습니다.
파일 시스템의 대소 문자 구분은 INFORMATION_SCHEMA
테이블의 문자열 컬럼에서 검색에 영향을 줄 수 있습니다. 자세한 내용은 섹션 10.1.7.9 "데이터 정렬과 INFORMATION_SCHEMA 검색" 을 참조하십시오.