늒네 기록

[mysql] 테이블 네이밍 컨벤션 2, lower_case_table_names 본문

DB 공부 기록/mysql

[mysql] 테이블 네이밍 컨벤션 2, lower_case_table_names

jaeha lee 2020. 9. 20. 13:08

[mysql] 테이블 네이밍 컨벤션 글에서 '테이블 이름 및 칼럼 이름 파스칼 케이스 사용'을 하겠다고 했었는데, MySQL Workbench로 로컬 인스턴스에 연결해서 'Project'라는 이름의 테이블을 생성하려고 했더니 다음과 같은 에러가 발생했다.

 

lower_case_table_names로 인한 에러

설정이 1로 되어있어서 Project 테이블 이름을 project 테이블로 바꿔서 생성하겠다고 한다. 파스칼 케이스를 사용하고 싶다면 해당 설정을 변경하면 그만이겠지만, 이런 설정이 존재하는 데에는 분명 이유가 있을 것이다. 해당 키워드를 가지고 검색을 하다보면, mysql 레퍼런스 매뉴얼 페이지가 나온다.

 

In MySQL, databases correspond to directories within the data directory. Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). Triggers also correspond to files. Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database, table, and trigger names. This means such names are not case-sensitive in Windows, but are case-sensitive in most varieties of Unix. 

 

위 내용에 따르면, 테이블은 파일로 저장되며, OS에 따라서 파일 이름 대소문자 구분을 안 하는 경우(Windows)가 있다. 이걸 앞서 생성하려고 한 'Project' 테이블에 적용시켜보면, 내 윈도우 로컬에서 돌리는 MySQL DB에서는 'Project' 테이블과 'project' 테이블을 구분하지 않으므로, 처음부터 이런 문제를 발생시키지 않기 위하여 테이블 이름을 소문자로 고정했을 것이라고 생각해볼 수 있다.

 

레퍼런스 매뉴얼 페이지에 lower_case_table_names 설정 값에 따른 작동 스펙이 다음과 같이 정리되어 있다.

 

On Unix, the default value of lower_case_table_names is 0. On Windows, the default value is 1. On macOS, the default value is 2.
value meaning
0 Table and database names are stored on disk using the lettercase specified in the CREATE TABLE or CREATE DATABASE statement. Name comparisons are case-sensitive. You should not set 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=0 on a case-insensitive file system and access MyISAM tablenames 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 the CREATE TABLE or CREATE DATABASE statement, but MySQL converts them to lowercase on lookup. Name comparisons are not case-sensitive. This works only on file systems that are not case-sensitive! InnoDB table names and view names are stored in lowercase, as for lower_case_table_names=1.

 

윈도우에서는 예상했던 것과 같이 저장할때나 불러올때 테이블 이름들을 전부 소문자로 저장해두는 식으로 작동하는 것을 확인할 수 있다.

 

그렇다면 처음에 계획했던 파스칼 케이스 네이밍 컨벤션을 포함해서 대문자 알파벳이 들어간 카멜 케이스도 사용할 수 없고, 그나마 소문자와 언더스코어로 이루어진 스네이크 케이스만 사용할 수 있을 것으로 보인다. 혹은, 리눅스 환경 같이 case-sensitive하게 이름 비교하는 OS를 사용하거나.

 

윈도우에서 작업한 것을 AWS RDB에 덤프 떠와서 사용하고, 반대로 AWS에 올라가있던 걸 윈도우에 덤프 떠와서 테스트해보고 하는 일이 발생할 수 있을 것을 고려하면 case-sensitive하지 않은 네이밍 컨벤션에 정착하는 것이 더 바람직해 보인다. 다음 글에서는 새로 정착할 컨벤션을 다시 정리해보겠다.

반응형
Comments