ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MySQL 대소문자 구별
    DataBase 2022. 3. 1. 21:01

    MySQL 대소문자 구별

    참고로 해당 내용은 MySQL 8점대 기준으로 설명하고 있습니다.

    • MySQL 의 대소문자는 MySQL 서버가 떠있는 운영체제에 따라서 다릅니다.
      • Windows 는 대소문자를 구별하지 않고(case-sensitive) Unix 의 변형 운영체제(예를 들어 Linux) 대소문자를 구별합니다. (case-insensitive)
      • MacOS의 경우 Unix 에 기반한 운영체제 지만 파일 시스템 타입이 대소문자를 구별하지 않는 형태입니다. 하지만, 대소문자를 구별하는 UFS도 지원합니다.(case-sensitive)
    • Partition, subpartition, 컬럼(컬럼 alias 를 포함한), 인덱스, stored routine, event, and resource group names 는 어떤 운영체제에서도 case-insensitive 합니다.
    • 하지만 로그파일의 이름은 case-sensitive 합니다.
    • 기본값으로 테이블 별칭들은 유닉스에서는 case sensitive 하고 윈도우와 맥에서는 case-insensitive 합니다.
      • 위의 쿼리는 유닉스에서는 동작하지 않지만 윈도우와 맥에서는 동작합니다.
    SELECT col_name FROM tbl_name AS a
    WHERE a.col_name = 1 OR A.col_name = 2;
    • 따라서 운영체제마다 다르기 때문에 팀간의 또는 자신만의 컨벤션을 만드는 것이 중요합니다. 예를 들어서 테이블이름은 항상 소문자로 작성한다든지 규칙을 정한다면 어떤 운영체제를 쓰든지 헷갈릴일은 현저히 줄어들 것입니다.
    • 본인 MySQL 서버가 case-sensitive 인지 case-insensitive 인지 알기 위해선 lower_case_table_names 변수의 값을 보면 알 수 있습니다.
      • 유닉스에서는 이 값이 기본값으로 0으로 되어있습니다.
      • 윈도우에서는 이 값이 기본값으로 1로 되어있습니다.
      • 맥에서는 기본값으로 2로 되어있습니다.
      • lower_case_table_names 는 서버를 초기화 할 때만 설정할 수 있습니다.
      • 서버가 초기화가 된 이후에는 고칠 수 없습니다.
      • Value의미
        0 테이블 이나 데이터베이스의 이름이 저장될 때 CREATE TABLE 이나 CREATE DATABASE 문에 지정된 대소문자를 사용하여 디스크에 저장됩니다. 이름 간의 비교가 case-sensitive 합니다. 만약 실행되고 있는 MySQL 서버가 파일 이름이 대소문자를 구분하지 않는 case-insensitive 한 환경이라면(윈도우와 맥 같이) lower_case_table_names 를 0으로 설정하는 것은 권장되지 않습니다. 만약 대소문자를 구분하지 않는 파일 시스템에서 --lower-case-table-names=0으로 이 변수를 0으로 강제하고 다른 문자 케이스를 사용하여 MyISAM 테이블 이름에 액세스하면 인덱스 손상이 발생할 수 있습니다.
        1 테이블 이름이 소문자로 디스크에 저장됩니다. 또한 이름간의 비교를 할 때 case-insensitive 합니다. MySQL은 저장 및 조회 시 모든 테이블 이름을 소문자로 변환합니다. 이는 데이터베이스 이름 및 테이블 별칭에도 적용됩니다
        2 테이블과 데이터베이스 이름이 CREATE TABLECREATE DATABASE 문에 지정된 대소문자를 사용하여 디스크에 저장되지만 MySQL 은 조회시 소문자로 변환합니다. 이름간의 비교는 파일 시스템이 case-insensitive 할 때만 case-insensitive 합니다. InnoDB 테이블 이름과 뷰 이름은 lower_case_table_names=1 일 때처럼 소문자로 저장됩니다.

    주의점

    • 이미 눈치 채신분도 있겠지만 사실 운영체제 하나에서만 MySQL 등을 이용한다면 이건 딱히 별 문제가 되지 않습니다. 하지만 만약 운영체제간의 데이터를 이전하는 문제가 있다면 두가지 해결 책이 있습니다.
      • 모든 플랫폼에서 lower_case_table_names 를 1로 설정하는 것입니다. 하지만 이렇게 하면 대소문자를 구분할 수 없습니다.
      • 윈도우는 2, 유닉스는 0 으로 값을 설정합니다. 하지만 이렇게 하면 대소문자를 명확히 써줘야 합니다.
      • 만약 innoDB를 사용한다면 모든 플랫폼에서 lower_case_table_names=1 로 설정합니다.

    참조

    'DataBase' 카테고리의 다른 글

    트랜잭션 격리수준  (0) 2022.07.21
    샤딩과 파티셔닝  (0) 2022.03.19
    MYSQL GROUP BY  (0) 2021.02.11

    댓글