MySQL 라 이브 러 리 이름 대소 문자 선택
10919 단어 MySQL라 이브 러 리 이름대소 문자
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 라 이브 러 리 이름 대소 문자 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.