2010-08-08 5 views
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; 

Ceci est l'une des tables de la base de données qui se trouve entièrement dans le jeu de caractères utf8. Le problème est ici (et je n'en avais pas parlé jusqu'à présent) que l'index pour la colonne pc_name sera trois fois plus grand, car MySQL réserve 3 piqûres pour chaque caractère. Dans ce cas, les index prendront beaucoup plus d'espace.Manière efficace d'indexer la colonne de la table MySQL avec le jeu de caractères utf8

Je ne peux pas faire d'index plus court, car j'ai besoin que cette valeur soit unique. Une des solutions pourrait être pc_name char(255) CHARSET latin1 NOT NULL, mais je ne sais pas si c'est un problème ou non. Est-ce une bonne idée ou existe-t-il des solutions que je ne connais pas?

Mise à jour: la colonne pc_name est validée dans l'application pour être valide utf8. Et il permet aux personnages non occidentaux. Mais dans ce cas, je peux juste faire un commerce de et permettre seulement /[_A-Za-z]/ si le cas en vaut la peine.

Mise à jour 2: J'ai essayé de mettre pc_name à latin1 charset, mais maintenant je reçois des exceptions comme: Zend_Db_Statement_Exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

+0

Les index sont normalement utilisés pour accélérer les requêtes plutôt que d'économiser de l'espace disque. –

+0

"L'index supplémentaire requis peut ajouter significativement à la taille totale de la table, même si la colonne elle-même est petite, et en particulier si la clé primaire est grande et ne sert à rien sauf aux vérifications de clé étrangère." – Ernest

Répondre

0

Si pc_name va contenir du texte non occidental latin1 alors ne va pas être une option ici - Sinon, vas-y.

N'étant pas un MySQL'er hardcore, je ne sais pas si le mélange de tables InnoDB et MySQL est chargé de problèmes - sinon, peut-être pourriez-vous faire de cette table une table MySQL standard et la laisser comme utf8?

+0

Merci de votre réponse. Je vais mettre à jour ma question. – Ernest

+0

Comme pour InnoDB, j'ai une autre table profile.id colonne comme clé étrangère. Donc j'aimerais rester avec. Vous ne savez pas si les moteurs de données modifient le problème mentionné. – Ernest

Questions connexes