MySql에서 테이블은 데이터베이스 디렉토리에 파일의 형태로 저장된다. 그런데 이 파일에 접근할 때 OS별로 대/소문자를 가리는 기준이 다르다.
windows: 대/소문자를 구분하지 않는다.
unix: 대부분의 unix에서는 대/소문자를 구분한다.
maxOS: unix 기반이지만 대/소문자를 구분하지 않는 기본 파일 시스템유형(HFS+)를 사용한다.
그러다 보니 간혹 이기종간에 프로그래밍시 오류가 발생한다. 예를 들어 windows 개발 환경에서 개발을 진행하고 별 생각 없이 unix 계열의 서버에 포팅하는 경우 낭패가 발생할 수 있다.
이런 문제를 해결하기 위해서 애초에 대/소문자를 구별해서 프로그래밍 했다면 별 문제 없겠지만 쉽지는 않다.
MySQL에서 관련 설정을 조절하기 위해서 lower_case_table_names 시스템 변수를 사용한다. lower_case_table_names 변수는 다음과 같은 값들을 가질 수 있다.
값
의미
0
Table and database names are stored on disk using the lettercase specified in theCREATE TABLEorCREATE DATABASEstatement. Name comparisons are case-sensitive. You shouldnotset this variable to 0 if you are running MySQL on a system that has case-insensitive file names (such as Windows or macOS). If you force this variable to 0 with--lower-case-table-names=0on a case-insensitive file system and accessMyISAMtablenames using different lettercases, index corruption may result.
1
Table names are stored in lowercase on disk and name comparisons are not case-sensitive. MySQL converts all table names to lowercase on storage and lookup. This behavior also applies to database names and table aliases.
2
Table and database names are stored on disk using the lettercase specified in theCREATE TABLEorCREATE DATABASEstatement, but MySQL converts them to lowercase on lookup. Name comparisons are not case-sensitive. This worksonlyon file systems that are not case-sensitive!InnoDBtable names and view names are stored in lowercase, as forlower_case_table_names=1.
Unix에서는 lower_case_table_names의 기본값이 0, Windows에서는 기본값이 1, macOS에서는 기본값이 2이다. lower_case_table_names 변수는 서버를 초기화할 때만 설정할 수 있고 서버가 초기화된 후에는 설정을 변경할 수 없습니다.
참고로 AWS RDS의 경우는 대/소문자를 구분하는 파일 시스템을 사용하므로 2번 옵션은 사용할 수 없다.