CREATE TABLE profile_category (
id mediumint UNSIGNED NOT NULL AUTO_INCREMENT,
pc_name char(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
これは、完全に utf8 文字セットであるデータベース内のテーブルの 1 つです。問題はここにあります (そして、私は今までそれについて新しく知りませんでした) pc_name
。MySQL はすべての文字に対して 3 バイトを予約するため、列のインデックスは 3 倍大きくなります。この場合、インデックスはより多くのスペースを必要とします。
この値は一意である必要があるため、短いインデックスを作成することはできません。解決策の1つを設定できますがpc_name char(255) CHARSET latin1 NOT NULL,
、これが問題かどうかはわかりません。これは良いアイデアですか、それとも私が知らない解決策はありますか?
更新:pc_name
列は有効な utf8 であることがアプリケーションで検証されます。また、西洋以外の文字も使用できます。しかし、この場合、私はただ取引を行い、/[_A-Za-z]/
そのケースが価値がある場合にのみ許可することができます.
更新 2: pc_name
latin1 charset に設定しようとしましたが、次のような例外が発生します。Zend_Db_Statement_Exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='