9.2.3 식별자와 파일 이름 매핑
데이터베이스 식별자와 테이블 식별자와 파일 시스템의 이름 사이에는 대응이 있습니다. 기본 구조는 MySQL은 각 데이터베이스를 데이터 디렉토리 내의 디렉토리로 표현하고 각 테이블을 적절한 데이터베이스 디렉토리에있는 하나 이상의 파일로 표현합니다. 테이블 형식의 파일 ( .FRM
)의 경우 데이터는 항상이 구조와 위치에 저장됩니다.
데이터 파일과 인덱스 파일의 경우 디스크의 정확한 표현은 스토리지 엔진에 따라 다릅니다. 이 파일을 FRM
파일과 같은 위치에 저장하거나 정보를 다른 파일에 저장할 수 있습니다. InnoDB
데이터는 InnoDB 데이터 파일에 저장됩니다. InnoDB
테이블 스페이스를 사용하는 경우에는 새로 생성 한 특정 테이블 스페이스 파일이 대신 사용됩니다.
데이터베이스 식별자 또는 테이블 식별자는 ASCII NUL ( 0x00
)를 제외한 모든 문자가 정당입니다. MySQL은 데이터베이스 디렉토리와 테이블 파일을 만들 때 해당 파일 시스템 객체에 문제가있는 모든 문자를 인코딩합니다.
기본적인 라틴 문자 (
a..zA..Z
), 숫자 (0..9
) 및 밑줄 (_
)은 그대로 인코딩됩니다. 따라서 그들이 대소 문자를 구별 여부는 파일 시스템의 특성에 직접적으로 의존합니다.대소 문자 매핑을 가지는 알파벳 기원의 다른 나라의 문자는 다음 표와 같이 인코딩됩니다. 코드 범위 컬럼 값은 UCS-2입니다.
코드 범위 패턴 번호 사용 미사용 블록 00C0..017F [@] [0..4] [g..z] 5 * 20 = 100 97 3 보충 라틴어 -1 + 확장 라틴어 -A 0370..03FF [@] [5..9] [g..z] 5 * 20 = 100 88 12 그리스어와 콥트어 0400..052F [@] [g..z] [0..6] 20 * 7 = 140 137 3 키릴 문자 + 보충 키릴 문자 0530..058F [@] [g..z] [7..8] 20 * 2 = 40 38 2 미국 영어 2160..217F [@] [g..z] [9] 20 * 1 = 20 16 4 숫자 형식 0180..02AF [@] [g..z] [a..k] 20 * 11 = 220 203 17 확장 라틴어 -B + 확장 IPA 1E00..1EFF [@] [g..z] [l..r] 20 * 7 = 140 136 4 확장 라틴어 추가 1F00..1FFF [@] [g..z] [s..z] 20 * 8 = 160 144 16 확장 그리스어 .... .... [@] [a..f] [g..z] 6 * 20 = 120 0 120 RESERVED 24B6..24E9 [@] [@] [a..z] 26 26 0 포위 문자 FF21..FF5A [@] [a..z] [@] 26 26 0 전각과 반각 시퀀스의 1 바이트가 대문자와 소문자의 구별을 인코딩합니다. 예 :
LATIN CAPITAL LETTER A WITH GRAVE
은@0G
로 인코딩되어LATIN SMALL LETTER A WITH GRAVE
은@0g
으로 인코딩됩니다. 여기에서는 3 번째 바이트 (G
또는g
)가 대문자와 소문자의 구별을 나타냅니다. (대소 문자를 구별하지 않는 파일 시스템에서는 두 문자는 동일하게 취급됩니다.)언어 블록에는 키릴 문자와 같이 두 번째 바이트가 대문자와 소문자를 결정할 수도 있습니다. 보충 라틴어 1 등의 다른 언어 블록에서는 3 번째 바이트가 대문자와 소문자를 결정합니다. 시퀀스의 2 바이트 문자의 경우 (확장 그리스어 등), 제일 왼쪽의 글자를 대문자와 소문자의 구별을 나타냅니다. 다른 문자 바이트는 모두 소문자 여야합니다.
밑줄 (
_
)를 제외한 모든 문자 이외의 문자는 대문자와 소문자의 매핑이없는 알파벳 기원 문자 (히브리어 등)과 함께a..f
의 16 진수 값에 소문자를 사용하는 16 진수 표현을 사용 하여 인코딩됩니다.0x003F -> @ 003f 0xFFFF -> @ffff
16 진수는
ucs2
더블 바이트 문자 집합의 문자 값에 해당합니다.
Windows에서는 nul
, prn
, aux
등의 일부 이름은 서버가 해당 파일 또는 디렉터리를 만들 때 @@@
이름에 추가하여 인코딩됩니다. 이것은 해당 데이터베이스 개체의 플랫폼간에 이식성을 위해 모든 플랫폼에서 이루어집니다.
MySQL 5.1.6 이전 버전의 데이터베이스와 테이블에서 특수 문자를 사용하고 그 하위 디렉토리 나 파일 이름이 그 특수 문자에 새로운 인코딩을 사용하도록 업데이트되지 않은 경우 서버는 INFORMATION_SCHEMA
테이블이나 SHOW
명령문의 출력에서 그 이름에 #mysql50#
라는 접두어를 붙여 표시합니다. 예를 들어, a@b
라는 테이블이 있고 그 이름 인코딩이 업데이트되지 않은 경우, SHOW TABLES
에 다음과 같이 표시됩니다.
mysql> SHOW TABLES;
+----------------+
| Tables_in_test |
+----------------+
| #mysql50#a@b |
+----------------+
인코딩이 업데이트되지 않은이 같은 이름을 참조하려면 #mysql50#
접두어를 추가해야합니다.
mysql>SHOW COLUMNS FROM `a@b`;
ERROR 1146 (42S02): Table 'test.a@b' doesn't exist mysql>SHOW COLUMNS FROM `#mysql50#a@b`;
+-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+
특수 접두어를 사용할 필요를 없애 구명을 업데이트하려면 mysqlcheck로 다시 인코딩하십시오. 다음 명령은 모든 이름을 새로운 인코딩을 업데이트합니다.
shell>mysqlcheck --check-upgrade --all-databases
shell>mysqlcheck --fix-db-names --fix-table-names --all-databases
특정 데이터베이스 또는 테이블만을 확인하려면 --all-databases
를 제거하고 적절한 데이터베이스 및 테이블 인수를 추가한다. mysqlcheck 호출 구문은 섹션 4.5.3 "mysqlcheck - 테이블 관리 프로그램" 을 참조하십시오.
#mysql50#
프리픽스는 서버가 내부적으로 사용하는 것 뿐이다. 이 접두어를 사용하는 이름으로 데이터베이스와 테이블을 작성하지 않도록하십시오.
또한 mysqlcheck는 특수 문자를 인코딩하는 데 사용하는 @
문자 그대로 인스턴스가 포함 된 이름을 수정할 수 없습니다. 이 문자가 포함 된 데이터베이스와 테이블을 사용하는 경우, mysqldump에서 그들을 덤프 한 후 MySQL 5.1.6 이상으로 업그레이드 업그레이드 후 덤프 파일을 다시로드합니다.