DB관련/MySQL

DB명 Table명 대소문자 구분 처리하기 (대소문자 구분 OS에서만 가능)

saltdoll 2016. 11. 8. 04:30
반응형

MySQL에서 DB명과 Table명을 대소문자 구분이 필요 할 때가 있습니다.

(해당 기능은 OS의 자체에서 대소문자가 구분이 되는 OS에서만 지원됩니다.)

>> : Win/Mac OS X에는 적용이 안된다고하네요? 왜 Mac OS에서 안된다고 하는지는 테스트 못해봄.

>> (결과) Mac OS X에 설치된 테이블명은 대소문자 구분이 가능

 (예: TestTable, 그러나 select * from testTABLE; 이명령도 처리됨)


출처: https://www.lesstif.com/pages/viewpage.action?pageId=14745775



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)

Value
Meaning
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';

 

반응형