2
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_namelatin1 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 '='

4

1 に答える 1

0

pc_name に西洋以外のテキストが含まれる場合、ここで latin1 を選択することはできません。

筋金入りの MySQL マニアではないので、InnoDB と MySQL テーブルを混在させると問題が発生するかどうかはわかりません。そうでない場合は、このテーブルを標準の MySQL テーブルにして、utf8 のままにしておくことができますか?

于 2010-08-08T19:28:55.927 に答える