MySQL 테이블 및 데이타베이스 이름 대소문자 구분 설정
MySQL 에서 database(Ex: testdb) 를 생성하면 다음 순서로 진행된다.
- my.cnf 에 설정된 datadir 경로에 database 이름의 directory 생성
- 해당 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)
Value | Meaning |
---|---|
0 | SELECT 나 Insert 사용시에도 대소문자를 구분해서 사용해야 한다. 대소문자를 구별하는 OS 에서만 의미가 있고 Windows/Mac OS X 에는 적용되지 않는다 |
1 | 테이블과 DB 이름을 소문자로 생성하며 참조시에는 소문자로 변경하여 처리한다. 기존에 대문자가 포함되어 생성한 테이블과 DB 는 문제가 될 수 있다. |
2 | 참조시에는 소문자로 변경한다. 대소문자를 구분하지 않는 파일 시스템을 가진 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';