SQL문을 작성하다보면 궁금증이 발동할 때가 있다.
데이터베이스명과 테이블명, 함수들을 대문자로 작성한 경우도 있고, 소문자로 작성한 경우도 있어서 헷갈리는 경우가 생기게 된다.
작성한 SQL을 실행시켜보면 대소문자의 구분없이도 잘 작동하는 경우도 있고 대소문자가 다르면 작동을 안하는 경우도 있다.
도대체 왜일까?
결론부터 말하자면, SQL문의 키워드(SELECT, INSERT 등)는 대소문자 구분을 안하고, 데이터베이스명, 테이블명, 트리거명은 OS의 파일시스템이 대소문자를 구분하는지에 따라서 대소문자를 구분할 때도 있고 안 할 때도 있다. Unix계열과 Linux 등의 운영체제에서는 파일시스템이 대소문자를 구분하기 때문에 데이터베이스명, 테이블명, 트리거명에서도 대소문자 구분을 하게 된다. Windows와 Mac OS(Mac OS의 디폴트는 대소문자를 구분 안하지만, 구분하는 파일시스템을 설정할 수도 있다)의 경우, OS 자체의 파일 시스템이 대소문자 구분을 하지 않기 때문에 대소문자 구분을 하지 않아도 SQL문은 정상적으로 실행된다.
MySQL의 경우, 데이터베이스를 생성하면 해당 데이터베이스명에 해당하는 디렉토리가 설정된 데이터 디렉토리에 생성되게 된다. 테이블의 경우에는 해당 테이블명에 해당하는 파일이 데이터베이스 디렉토리에 생기게 된다. 트리거도 마찬가지로 파일이 생성되게 된다. 지정한 데이터베이스명, 테이블명의 디렉토리와 파일을 사용하기 때문에 OS의 파일 시스템의 대소문자 구분 여부(case sensitivity)에 종속적이게 되는 것이다.
실제로 생성되는 디렉토리와 파일을 확인해보자. 먼저 MySQL 설정파일에서 datadir가 어디로 설정되어 있는지 확인하자. MySQL 설정파일은 일반적으로 /etc/my.cnf, /etc/mysql 등의 경로에 있다.
$ cat /etc/mysql.cnf
... 생략 ...
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
... 생략 ...
datadir가 /var/lib/mysql 로 설정되어 있음을 알 수 있다. 해당 디렉토리로 이동하여 어떤 디렉토리가 있는지 확인해보자.
$ cd /var/lib/mysql
$ ls
... 생략 ...
mysql
performance_schema
mysql.sock
생성한데이터베이스명 등
... 생략 ...
데이터베이스명들과 똑같은 이름의 디렉토리들이 있음을 확인할 수 있다. 데이터베이스 디렉토리 내부의 파일을 확인해보면 테이블명에 해당하는 파일이 있음을 확인할 수 있다.
$ ls 데이터베이스명
table1.frm table1.ibd db.opt table2.frm table2.ibd ... # table1, table2는 설정한 테이블명
이런 식으로 데이터베이스가 디렉토리에, 테이블과 트리거가 파일에 대응하기 때문에 OS의 파일 시스템의 대소문자 구분 여부에 따라 SQL문 상에서도 데이터베이스명, 테이블명, 트리거명의 대소문자 구분 여부가 결정된다. Windows나 MacOS의 경우, 파일시스템이 대소문자 구분을 하지 않기 때문에 dir, Dir, diR 등으로 디렉토리를 나타내도 똑같은 디렉토리를 의미한다. 해당 시스템에 설치된 MySQL에 쿼리를 보내는 경우, 대소문자를 구분하지 않아도 되고, 리눅스 등 파일시스템이 대소문자를 구분하는 경우에는 데이터베이스명, 테이블명의 대소문자를 구분해야 한다.
파일 시스템에 따라서 대소문자를 구분하지 않아도 되는 경우가 있지만, 웬만하면 통일된 대소문자 작성 규칙을 가지고 쿼리를 작성하도록 하자. 혼동을 줄이고 에러 예방이 가능하다. 통일된 규칙을 적용하면 혹시라도 대소문자 구분 여부가 다른 시스템 간에 마이그레이션하는 경우에도 수고로움도 줄일 수 있을 것 같다.
오늘도 제 글을 읽어주셔서 감사합니다. 행복한 하루 되세요 :)
'개발관련' 카테고리의 다른 글
Google AdSense Site Verification 실패 시 해결 경험 (0) | 2023.12.17 |
---|---|
AWS에서 NAT Gateway의 비용을 낮춰보자! (0) | 2023.11.07 |
Chrome Lighthouse 소개 - 개발한 사이트의 성능, 접근성, PWA, SEO를 체크해보자! (0) | 2023.07.23 |
AWS CLI 자동완성 기능 설정하기 (0) | 2023.07.13 |
현재 사용하고 있는 컴퓨터 Public IP (공인 IP) 알아내는 방법 (0) | 2023.07.08 |