web-dev-qa-db-ja.com

エラー1071(42000):指定されたキーが長すぎます。キーの最大長は767バイトです

_latin1_文字セットを含むデータベースがあります。テーブルの文字セットを_utf8_に変更する必要がありますが、エラーが発生します。現在の文字セットは次のとおりです。

_mysql> show variables like "%character%";
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
_

文字セットを変更したいテーブルは:

_mysql> describe spool;
+------------+---------------------+------+-----+-------------------+----------------+
| Field      | Type                | Null | Key | Default           | Extra          |
+------------+---------------------+------+-----+-------------------+----------------+
| username   | varchar(250)        | NO   | MUL | NULL              |                |
| xml        | text                | NO   |     | NULL              |                |
| seq        | bigint(20) unsigned | NO   | PRI | NULL              | auto_increment |
| created_at | timestamp           | NO   |     | CURRENT_TIMESTAMP |                |
+------------+---------------------+------+-----+-------------------+----------------+
4 rows in set (0.00 sec)
_

文字セットを変更したいとき、次のエラーが表示されます:

_mysql> ALTER TABLE spool CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
_

これは会社で機能するデータベースであり、機能を妨げたくないので、varchar(250)タイプのサイズを変更したくありません。このエンコーディングを変更する解決策があるかどうか疑問に思います。

_mysql> show create table spool\G;
*************************** 1. row ***************************
       Table: spool
Create Table: CREATE TABLE `spool` (
  `username` varchar(250) NOT NULL,
  `xml` text NOT NULL,
  `seq` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `seq` (`seq`),
  KEY `i_despool` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23490775 DEFAULT CHARSET=utf8
_
2
amir jj

解決済み:

この問題を解決するには、次のように新しいテーブルを作成しますspool。 _utf8mb4 COLLATE utf8mb4_unicode_ci_(この新しいエンコーディングでは文字ごとに4バイト)であるため、_250 * 4 = 1000_文字セットでテーブルを作成する場合、varchar(250)を使用できません。 1000は、このエンコーディングの最大キー767バイトを超えています。 varchar(100)でテーブルspoolllを作成します。

_CREATE TABLE `spoollll` (
  `username` varchar(100) NOT NULL,
  `xml` text NOT NULL,
  `seq` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `seq` (`seq`),
  KEY `i_despool` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=23492667 DEFAULT CHARSET=utf8 
_

そして今私は文字セットを変更します:

_mysql> ALTER TABLE spoollll CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
_

誰かがそれにコメントして、この問題を完了していただければ幸いです。

0
amir jj