MySQL 라 이브 러 리 이름 대소 문자 선택

1.대소 문자 가 민감 한 지 여 부 를 결정 하 는 인자
MySQL 에서 데이터 베 이 스 는 data 디 렉 터 리 의 디 렉 터 리 와 대응 합 니 다.데이터베이스 에 있 는 모든 표 는 데이터베이스 디 렉 터 리 에 있 는 최소한 의 파일(여러 파일 일 수 있 으 며,구체 적 으로 는 저장 엔진 에 달 려 있다)에 대응 합 니 다.따라서 운영 체제 의 대소 문자 가 민감 한 지 여 부 는 데이터베이스 대소 문자 가 민감 한 지 여 부 를 결정 하고,윈도 시스템 은 대소 문자 에 민감 하지 않 으 며,리 눅 스 시스템 은 대소 문자 에 민감 하 다.
기본적으로 라 이브 러 리 이름 은 윈도 시스템 에 서 는 대소 문 자 를 구분 하지 않 고 리 눅 스 시스템 에 서 는 대소 문 자 를 구분 합 니 다.열 이름,색인 이름,저장 과정,함수 및 이벤트 이름 은 모든 운영 체제 에서 대소 문 자 를 구분 하지 않 고 열 별명 도 대소 문 자 를 구분 하지 않 습 니 다.
이외에 도 MySQL 은 lower 를 제공 합 니 다.case_table_names 시스템 변 수 는 표 와 데이터 베이스 이름 이 디스크 에 저장 되 는 방식 과 MySQL 에서 의 사용 방식 에 영향 을 줄 수 있 습 니 다.Linux 시스템 에 서 는 이 매개 변 수 는 기본적으로 0 이 고 Windows 시스템 에 서 는 기본 값 이 1 이 며 macOS 시스템 에 서 는 기본 값 이 2 입 니 다.다음은 각 값 의 구체 적 인 의 미 를 살 펴 보 겠 습 니 다.
Value
Meaning
0
라 이브 러 리 이름 은 생 성 문 에서 지정 한 알파벳 대소 문자 로 디스크 에 저장 되 며 이름 은 대소 문 자 를 구분 합 니 다.
1
라 이브 러 리 이름 은 소문 자로 디스크 에 저장 되 어 있 으 며 이름 은 대소 문 자 를 구분 하지 않 습 니 다.MySQL 은 모든 테이블 이름 을 저장 하고 찾 을 때 소문 자로 변환 합 니 다.이 행 위 는 데이터베이스 이름과 표 별명 에 도 적용 된다.
2
라 이브 러 리 이름 은 생 성 구문 에서 지정 한 알파벳 대소 문자 로 디스크 에 저장 되 지만 MySQL 은 찾 을 때 소문 자로 변환 합 니 다.이름 은 대소 문 자 를 구분 하지 않 습 니 다.
보통 소장 lowercase_table_names 매개 변 수 는 2 로 설정 되 어 있 으 며,아래 는 0 또는 1 로 설정 한 경우 만 토론 합 니 다.Linux 시스템 에 서 는 기본적으로 0 즉 대소 문 자 를 구분 합 니 다.lower 를 살 펴 보 겠 습 니 다.case_table_names 가 0 일 때 데이터베이스 의 구체 적 인 표현:

#       
mysql> show variables like 'lower_case_table_names';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 0     |
+------------------------+-------+

#      
mysql> create database TestDb;
Query OK, 1 row affected (0.01 sec)

mysql> create database testdb;
Query OK, 1 row affected (0.02 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| TestDb             |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+

mysql> use testdb;
Database changed
mysql> use TestDb;
Database changed
mysql> use TESTDB;
ERROR 1049 (42000): Unknown database 'TESTDB'

#    
mysql> CREATE TABLE if not exists `test_tb` (
    ->   `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '    ',
    ->   `stu_id` int(11) NOT NULL COMMENT '  ',
    ->   `stu_name` varchar(20) DEFAULT NULL COMMENT '    ',
    ->   PRIMARY KEY (`increment_id`),
    ->   UNIQUE KEY `uk_stu_id` (`stu_id`) USING BTREE
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='test_tb';
Query OK, 0 rows affected (0.06 sec)
mysql> CREATE TABLE if not exists `Student_Info` (
    ->   `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '    ',
    ->   `Stu_id` int(11) NOT NULL COMMENT '  ',
    ->   `Stu_name` varchar(20) DEFAULT NULL COMMENT '    ',
    ->   PRIMARY KEY (`increment_id`),
    ->   UNIQUE KEY `uk_stu_id` (`Stu_id`) USING BTREE
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Student_Info';
Query OK, 0 rows affected (0.06 sec)
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| Student_Info     |
| test_tb          |
+------------------+

#    
mysql> select Stu_id,Stu_name from test_tb limit 1;
+--------+----------+
| Stu_id | Stu_name |
+--------+----------+
|   1001 | from1    |
+--------+----------+
1 row in set (0.00 sec)
mysql> select stu_id,stu_name from test_tb limit 1;
+--------+----------+
| stu_id | stu_name |
+--------+----------+
|   1001 | from1    |
+--------+----------+

mysql> select stu_id,stu_name from Test_tb;
ERROR 1146 (42S02): Table 'testdb.Test_tb' doesn't exist
mysql> select Stu_id,Stu_name from test_tb as A where A.Stu_id = 1001; 
+--------+----------+
| Stu_id | Stu_name |
+--------+----------+
|   1001 | from1    |
+--------+----------+
1 row in set (0.00 sec)
mysql> select Stu_id,Stu_name from test_tb as A where a.Stu_id = 1001;
ERROR 1054 (42S22): Unknown column 'a.Stu_id' in 'where clause'

#            
[root@localhost ~]#:/var/lib/mysql# ls -lh
total 616M
drwxr-x--- 2 mysql mysql   20 Jun  3 14:25 TestDb
...
drwxr-x--- 2 mysql mysql  144 Jun  3 14:40 testdb
[root@localhost ~]#:/var/lib/mysql# cd testdb/
[root@localhost ~]#:/var/lib/mysql/testdb# ls -lh
total 376K
-rw-r----- 1 mysql mysql 8.6K Jun  3 14:33 Student_Info.frm
-rw-r----- 1 mysql mysql 112K Jun  3 14:33 Student_Info.ibd
-rw-r----- 1 mysql mysql 8.6K Jun  3 14:40 TEST_TB.frm
-rw-r----- 1 mysql mysql 112K Jun  3 14:40 TEST_TB.ibd
-rw-r----- 1 mysql mysql   67 Jun  3 14:25 db.opt
-rw-r----- 1 mysql mysql 8.6K Jun  3 14:30 test_tb.frm
-rw-r----- 1 mysql mysql 112K Jun  3 14:30 test_tb.ibd
이상 의 실험 을 통 해 우 리 는 lower 를 발견 하 였 다.case_table_names 매개 변 수 를 0 으로 설정 할 때 MySQL 라 이브 러 리 표 이름 은 대소 문 자 를 엄 격 히 구분 하고 표 별명 은 대소 문 자 를 똑 같이 구분 하지만 열 이름 은 대소 문 자 를 구분 하지 않 으 며 조회 할 때 도 대소 문자 에 따라 엄 격 히 써 야 합 니 다.또한 이름 은 같 지만 대소 문자 가 다른 라 이브 러 리 이름 을 만 들 수 있 습 니 다(예 를 들 어 TestDb 와 testdb 라 이브 러 리 가 공존 할 수 있 도록 합 니 다).
당신 은 lower 를 고려 해 본 적 이 있 습 니까?case_table_names 를 0 으로 설정 하면 어떤 가능 한 문제 가 발생 할 수 있 습 니까?예 를 들 어 한 동료 가 Test 표를 만 들 었 고 다른 동료 가 프로그램 호출 을 쓸 때 test 표 로 쓰 면 오류 가 존재 하지 않 을 수 있 습 니 다.더욱 심 한 경우 TestDb 라 이브 러 리 와 testdb 라 이브 러 리 가 공존 하고 Test 표 와 test 표 가 공존 하 는 상황 이 발생 하여 더욱 혼 란 스 러 울 수 있 습 니 다.따라서 가장 큰 이식 성과 용이 성 을 실현 하기 위해 우 리 는 소문 자 이름 으로 라 이브 러 리 표를 만 들 고 인용 하 는 등 일치 하 는 약속 을 할 수 있 습 니 다.lowercase_table_names 를 1 로 설정 하여 이 문 제 를 해결 합 니 다.이 매개 변수 가 1 일 때의 상황 을 살 펴 보 겠 습 니 다.

#             lower_case_table_names    1        
mysql> show variables like 'lower_case_table_names';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_table_names | 1     |
+------------------------+-------+

#      
mysql> create database TestDb;
Query OK, 1 row affected (0.02 sec)

mysql> create database testdb;
ERROR 1007 (HY000): Can't create database 'testdb'; database exists
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| testdb             |
+--------------------+
7 rows in set (0.00 sec)

mysql> use testdb;
Database changed
mysql> use TESTDB;
Database changed

#    
mysql> CREATE TABLE if not exists `test_tb` (
    ->   `increment_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '    ',
    ->   `stu_id` int(11) NOT NULL COMMENT '  ',
    ->   `stu_name` varchar(20) DEFAULT NULL COMMENT '    ',
    ->   PRIMARY KEY (`increment_id`),
    ->   UNIQUE KEY `uk_stu_id` (`stu_id`) USING BTREE
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='test_tb';
Query OK, 0 rows affected (0.05 sec)
mysql> create table TEST_TB (id int);
ERROR 1050 (42S01): Table 'test_tb' already exists

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| test_tb          |
+------------------+

#    
mysql> select stu_id,stu_name from test_tb limit 1;
+--------+----------+
| stu_id | stu_name |
+--------+----------+
|   1001 | from1    |
+--------+----------+
1 row in set (0.00 sec)

mysql> select stu_id,stu_name from Test_Tb limit 1;       
+--------+----------+
| stu_id | stu_name |
+--------+----------+
|   1001 | from1    |
+--------+----------+
1 row in set (0.00 sec)

mysql> select stu_id,stu_name from test_tb as A where a.stu_id = 1002;
+--------+----------+
| stu_id | stu_name |
+--------+----------+
|   1002 | dfsfd    |
+--------+----------+
1 row in set (0.00 sec)
lowercase_table_names 매개 변 수 를 1 로 설정 하면 라 이브 러 리 이름 을 소문 자로 통일 적 으로 저장 할 수 있 고 조회 할 때 대소 문 자 를 구분 하지 않 으 며 대소 문자 로 모두 찾 을 수 있 습 니 다.이렇게 하면 더욱 쉽게 사용 할 수 있 습 니 다.프로그램 에 서 는 대문자 표 이름 이 든 소문 자 표 이름 이 든 모두 이 표를 찾 을 수 있 고 서로 다른 시스템 간 데이터 베 이 스 를 이전 하 는 것 도 편리 합 니 다.이것 도 lower 를 추천 합 니 다.case_table_names 매개 변 수 를 1 로 설정 한 이유.
2.파라미터 변경 주의사항
lower_case_table_names 매개 변 수 는 전역 시스템 변수 입 니 다.동적 으로 수정 할 수 없습니다.변경 하려 면 설정 파일 을 쓰 고 데이터 베 이 스 를 다시 시작 해 야 합 니 다.데이터베이스 에 이 인자 가 처음에 0 이 었 다 면,지금 은 1 로 바 꾸 려 고 합 니 다.이 경우,원본 인 스 턴 스 에 대문자 라 이브 러 리 가 존재 하면 1 로 바 꾸 어 다시 시작 하면 라 이브 러 리 에 접근 할 수 없 기 때 문 입 니 다.필요 하 다 면 lowercase_table_names 매개 변 수 는 0 에서 1 로 바 꾸 고 다음 단계 에 따라 수정 할 수 있 습 니 다.
먼저 실례 에 대문자 라 이브 러 리 와 테이블 이 존재 하 는 지 확인 하고 대문자 라 이브 러 리 테이블 이 존재 하지 않 으 면 프로필 을 직접 수정 하고 다시 시작 할 수 있 습 니 다.대문자 라 이브 러 리 가 존재 한다 면 대문자 라 이브 러 리 를 소문 자로 바 꾼 다음 설정 파일 을 수정 하여 다시 시작 할 수 있 습 니 다.
인 스 턴 스 에 대문자 라 이브 러 리 가 존재 할 때 다음 두 가지 방법 으로 소문 자로 바 꿀 수 있 습 니 다.
1.my sqldump 를 통 해 관련 라 이브 러 리 를 백업 하고 백업 이 완료 되면 해당 라 이브 러 리 를 삭제 한 다음 설정 파일 을 수정 하여 다시 시작 합 니 다.마지막 으로 백업 파일 을 다시 가 져 옵 니 다.이 방법 은 사용 시간 이 비교적 길 어서 일반적으로 거의 사용 되 지 않 는 다.
2.rename 문 구 를 통 해 다음 SQL 을 참고 할 수 있 습 니 다.

#             
rename table TEST to test;

#                                  
rename table TESTDB.test_tb to testdb.test_tb;

#          SQL
#             
SELECT
 TABLE_SCHEMA,
 TABLE_NAME
FROM
 information_schema.`TABLES` 
WHERE
 TABLE_SCHEMA NOT IN ( 'information_schema', 'sys', 'mysql', 'performance_schema' ) 
 AND table_type = 'BASE TABLE' 
 AND TABLE_NAME REGEXP BINARY '[A-Z]'
  
 
#   SQL              
SELECT
 CONCAT( 'rename table TESTDB.', TABLE_NAME, ' to testdb.', TABLE_NAME, ';' ) 
FROM
 information_schema.TABLES 
WHERE
 TABLE_SCHEMA = 'TESTDB';
요약:
이 글 은 주로 MySQL 라 이브 러 리 의 대소 문자 문 제 를 소 개 했 습 니 다.이 글 을 본 후에 라 이브 러 리 이름 이 왜 소문 자 영 어 를 사용 하 는 지 알 아야 합 니 다.lower 를 변경 하고 싶다 면case_table_names 인자,다음 글 도 참고 하 세 요.
이상 은 MySQL 라 이브 러 리 이름 대소 문자 선택 에 대한 상세 한 내용 입 니 다.MySQL 라 이브 러 리 이름 대소 문자 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기