2016-03-07 1 views
1

Je viens d'installer Debian 8.3 sur une machine virtuelle et installé xampp après cela Tutorial. Tout fonctionne, jusqu'à ce que j'essayé de créer une nouvelle table:mysql modifier innodb_large_prefix

create table testtable 
(
    id int(10) not null auto_increment, 
    firstname varchar(255) collate utf8mb4_german2_ci not null, 
    lastname varchar(255) collate utf8mb4_german2_ci not null, 
    primary key (id), 
    unique key (lastname) 
)engine = innodb default charset=utf8mb4, collate=utf8mb4_german2_ci 

Je suis l'erreur: #1709 - Index column size too large. The maximum column size is 767 bytes. Puis j'ai découvert cela vient du prefix limitation qui se limite à 767Byte dans Innodb et je peux résoudre ce problème en jeu le fichier innodb_large_prefix dans le fichier my.cnf. Mais je ne peux pas trouver le fichier, ce n'est pas /etc/ et theres pas /etc/mysql/-dossier, le seul my.cnf j'ai trouvé est /opt/lampp/etc/, cependant, après avoir ajouté le innodb_large_prefix=1 dans le fichier et redémarré lampp. J'ai toujours la même erreur. Qu'ai-je fait de mal?

modifier: SELECT version() retours 5.6.14, donc innodb_large_prefix doit être pris en charge.

edit2: Je sais que je peux contourner ce problème en définissant seulement une partie de la clé en tant qu'index pour passer sous 767Byte. Mais je veux savoir comment configurer correctement le mysql.

Répondre

5

Entre 5.6.3 et 5.7.7, il existe 4 étapes:

  • SET GLOBAL innodb_file_format = Barracuda;
  • SET GLOBAL innodb_file_per_table = ON;
  • ROW_FORMAT = DYNAMIQUE; - ou Compressé (va à la fin de CREATE)
  • innodb_large_prefix = 1

Remarque

SELECT * FROM information_schema.INNODB_SYS_TABLESPACES; 

fournira la file_format et ROW_FORMAT. D'autres tables I_S fournissent des indices sur file_per_table.

+1

Son pas très clair où je devrais mettre ceux-ci, dans le fichier 'my.cnf' j'ai trouvé dans le'/opt/lampp/etc/'dossier? J'ai vu quelques suggestions où ils ont mis 'ROW_FORMAT = DYNAMIC' dans la ligne' engine', mais cela n'a pas résolu le problème pour moi. – yangsunny

+1

en cours d'exécution 'SHOW GLOBAL VARIABLES LIKE 'innodb_fil%'' donnez-moi le résultat que 'innodb_file_per_table' est déjà activé. J'ai donc ajouté la ligne 'innodb_file_format = Barracuda' (sans SET GLOBAL) et' innodb_large_prefix = 1' dans le fichier 'my.cnf' et' ROW_FORMAT = DYNAMIC' à la fin de CREATE. Et ça marche! Merci beaucoup. Une chose, le changement file_format aura-t-il un effet sur mes données existantes? – yangsunny

+0

Non. Tous ces paramètres sont capturés lors de la création d'une table. (Vous pouvez modifier les tables existantes en utilisant ALTER.) J'ai ajouté une note. –

0

Accédez à votre xampp et ajoutez cette requête:

`mysql>` set global innodb_file_format = `BARRACUDA`; 
`mysql>` set global innodb_large_prefix = `ON`; 
0
mysql> set global innodb_file_format = `BARRACUDA`; 
mysql> set global innodb_large_prefix = `ON`; 
+4

Salut et bienvenue à SO! Bien que le code puisse parler de lui-même en fournissant quelques détails aiderait à améliorer la qualité de votre réponse! – mrun

+1

Bienvenue dans Stack Overflow! Merci pour cet extrait de code, qui peut fournir une aide immédiate. Une explication appropriée [améliorerait considérablement] (// meta.stackexchange.com/q/114762) sa valeur éducative en montrant * pourquoi * ceci est une bonne solution au problème, et le rendrait plus utile aux futurs lecteurs avec des semblables, mais pas identique, des questions.S'il vous plaît [modifier] votre réponse pour ajouter une explication, et donner une indication des limites et des hypothèses qui s'appliquent. –