2017-10-06 16 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

私はそれが問題を引き起こす固有の制約ではないと思います。もし私が2つのvarchar(255)(キーではない)、エラーが発生しますか? – skyman

+0

問題は、UNICODE(最大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) 
関連する問題