2017-10-06 1 views
1

이전 MySQL/Spring/Eclipselink 프로젝트를 MariaDB로 포팅하기 시작했습니다. 그러나 나는 그것을 올바른/관리하는 방법을 모른다,MariaDB 문자 인코딩

MariaDB [spasm]> CREATE TABLE Configuration (ID BIGINT NOT NULL, Attribute VARCHAR(190) NOT NULL UNIQUE, Value VARCHAR(255) NOT NULL, PRIMARY KEY (ID)); 
Query OK, 0 rows affected (0.07 sec) 

MariaDB [spasm]> drop table Configuration; 
Query OK, 0 rows affected (0.06 sec) 

MariaDB [spasm]> CREATE TABLE Configuration (ID BIGINT NOT NULL, Attribute VARCHAR(255) NOT NULL UNIQUE, Value VARCHAR(255) NOT NULL, PRIMARY KEY (ID)); 
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes 
MariaDB [spasm]> 

MariaDB [spasm]> show variables like '%char%'; 
+--------------------------+----------------------------+ 
| Variable_name   | Value      | 
+--------------------------+----------------------------+ 
| character_set_client  | utf8mb4     | 
| character_set_connection | utf8mb4     | 
| character_set_database | utf8mb4     | 
| character_set_filesystem | binary      | 
| character_set_results | utf8mb4     | 
| character_set_server  | utf8mb4     | 
| character_set_system  | utf8      | 
| character_sets_dir  | /usr/share/mysql/charsets/ | 
+--------------------------+----------------------------+ 
8 rows in set (0.00 sec) 

나는이가 문자 인코딩 관련이 있음을 이해 : 나는 다음과 같이 설명 될 수있는 테이블 작성에 문제가 발생하고있다?

+1

전체 255 멀티 바이트 문자에 대한 고유 제한 조건이 필요하고 InnoDB 스토리지 엔진을 사용하는 경우 ** innodb_large_prefix **를 사용 가능으로 설정하는 것이 좋습니다. 참조 : https://mariadb.com/kb/en/library/xtradbinnodb-server-system-variables/#innodb_large_prefix – spencer7593

+0

문제가되는 고유 한 제약 조건이 아닌 것 같습니다. - 두 개의 varchar (255) (키가 아님) 오류가 발생합니까? – skyman

+0

문제는 유니 코드 (최대 4 바이트)를 처리하기 위해 실제 크기가 커야하는 INDEX와 관련되어 있으므로 한도를 초과합니다. 그래서'PRIMARY KEY'는'UNIQUE INDEX'를 만들려고 시도 할 것이고 우주 문제 때문에 실패 할 것입니다. :-(여러 번 물린 경우 –

답변

3

새 기본값 CHARACTER SETutf8mb4입니다. 그것은 UNIQUE 인덱스에 대해 불평 :

Attribute VARCHAR(255) NOT NULL UNIQUE 

당신 때문에 문자 집합 utf8mb4를 사용하려고의 한계를 타격하는 경우. 그런 다음 오류 방지하려면 다음 중 하나를 (각각 단점이있다) 수행

⚈ Upgrade to 5.7.7 (MariaDB 10.2.2?) for 3072 byte limit -- your cloud may not provide this; 
⚈ Change 255 to 191 on the VARCHAR -- you lose any values longer than 191 characters (unlikely?); 
⚈ ALTER .. CONVERT TO utf8 -- you lose Emoji and some of Chinese; 
⚈ Use a "prefix" index -- you lose some of the performance benefits. 

또는 ... 5.6/5.5/10.1 그대로 만 3072 바이트로 제한을 높이기 위해 4 단계를 수행

SET GLOBAL innodb_file_format=Barracuda; 
SET GLOBAL innodb_file_per_table=1; 
SET GLOBAL innodb_large_prefix=1; 
logout & login (to get the global values); 
ALTER TABLE tbl ROW_FORMAT=DYNAMIC; -- (or COMPRESSED)