DB/mysql

SQL 작성 시 테이블 이름의 대소문자 구분

  • -

https://dev.mysql.com/doc/refman/8.4/en/identifier-case-sensitivity.html

 

MySQL :: MySQL 8.4 Reference Manual :: 11.2.3 Identifier Case Sensitivity

11.2.3 Identifier Case Sensitivity 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). T

dev.mysql.com

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 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.


Unix에서는 lower_case_table_names의 기본값이 0, Windows에서는 기본값이 1, macOS에서는 기본값이 2이다. lower_case_table_names 변수는 서버를 초기화할 때만 설정할 수 있고 서버가 초기화된 후에는 설정을 변경할 수 없습니다.

참고로 AWS RDS의 경우는 대/소문자를 구분하는 파일 시스템을 사용하므로 2번 옵션은 사용할 수 없다.

'DB > mysql' 카테고리의 다른 글

[mysql]character set과 collation  (3) 2024.09.09
[sakila] join & subquery 연습  (1) 2024.04.09
[sakila] 단일행 함수 활용 연습  (0) 2024.03.13
[sakila] 기본 쿼리 연습  (0) 2024.03.13
[mysql]알아두면 유용한 설정  (0) 2023.02.05
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.