MySQL 테이블 및 데이타베이스 이름 대소문자 구분 설정

MySQL 에서 database(Ex: testdb) 를 생성하면 다음 순서로 진행된다.

  1. my.cnf 에 설정된 datadir 경로에 database 이름의 directory 생성
  2. 해당 database 내에 table 생성시 table명으로 파일이 생성된다.


예로 RHEL/CentOS 용으로 패키징된 MySQL 의 경우 특별히 설정하지 않았다면 datadir 경로는 /var/lib/mysql 이므로

CREATE DATABASE testdb CHARACTER SET utf8 COLLATE utf8_bin;
GRANT ALL PRIVILEGES ON testdb.* TO 'testdb'@'localhost' IDENTIFIED BY 'testdbPwd';

/var/lib/mysql/testdb/ 디렉토리가 생기고 다음과 같은 테이블을 생성할 경우 /var/lib/mysql/testdb/test_tbl.frm 같이 tablename.frm 파일이 생성된다.

use testdb;
create table Test_Tbl (
     id int primary key auto_increment, 
     name varchar(30) not null
);


MySQL 에서 테이블 사용시 Windows 에서는 대소문자 구분이 안 되는데 Linux나 Un*x 계열에서는 대소문자 구분을 해야 하는 이유는 바로 table 과 database 명이 directory와 file 명이기 때문이다.

Windows 에서는 디렉토리와 파일에 접근할때 대소문자 구분을 하지 않으나 Linux/Unix 는 구분하므로 select 나 insert 시에 테이블의 대소문자를 구분하게 된다.


설정값은 다음과 같이 3가지로 (http://dev.mysql.com/doc/refman/5.5/en/identifier-case-sensitivity.html)

ValueMeaning
0

 CREATE TABLE 이나 CREATE DATABASE 실행시 디스크에 저장되는 테이블과 데이타베이스의 이름을 대소문자를 구분해서 생성한다.

SELECT 나 Insert 사용시에도 대소문자를 구분해서 사용해야 한다. 대소문자를 구별하는 OS 에서만 의미가 있고 Windows/Mac OS X 에는 적용되지 않는다

1테이블과 DB 이름을 소문자로 생성하며 참조시에는 소문자로 변경하여 처리한다. 기존에 대문자가 포함되어 생성한 테이블과 DB 는 문제가 될 수 있다.
2

 CREATE TABLE 이나 CREATE DATABASE 실행시 디스크에 저장되는 테이블과 데이타베이스의 이름을 대소문자를 구분해서 생성한다.

참조시에는 소문자로 변경한다. 대소문자를 구분하지 않는 파일 시스템을 가진 OS(Mac OS X) 에서만 동작한다.


현재 설정값은 다음 variable 을 확인하면 된다.

mysql> show variables like 'lower%';

+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)



my.cnf 에 다음 옵션을 넣어주고 재구동하면 table name과 database name 을 소문자로 저장하고 찾을때 대소문자 구분을 하지 않으므로 SQL 문에서 table과 database 를 대소문자 구분없이 사용할 수 있다.

[mysqld]
lower_case_table_names = 1
lower_case_table_names 를 1로 설정해도 기존에 생성한 데이타베이스와 테이블은 대소문자를 구분하므로 기존 테이블과 DB 의 이름을 변경해야 한다.
your_schema_name 에 DB 이름을 넣고 다음 쿼리를 수행하면 rename 구문을 만들어 준다.(http://stackoverflow.com/questions/1262258/mysql-case-sensitive-tables-conversion)
mysql > select concat('rename table ', table_name, ' to ' , lower(table_name) , ';') 
from information_schema.tables where table_schema = 'your_schema_name';



Ref