A voir également:
- [MySQL] Problème Foreign Key
- Mysql community server - Télécharger - Bases de données
- Key windows 10 gratuit - Guide
- Show key plus - Télécharger - Utilitaires
- Joy to key - Télécharger - Émulation & Virtualisation
- Master key - Télécharger - Sécurité
6 réponses
Ops, je remonte mon petit topic des fois que certaines personnes ne l'ayant pas vus aient la solution ^^
J'ai encore passé quelques heures dessus mais je suis vraiment bloqué là... J'ai touché tout ce que je pouvais avec les index mais rien ne fonctionne. Ca vient peut-être de l'indexation automatique/obligatoire pour les champs text mais je ne sais pas comment faire autrement puisque, même en indexant explicitement avec un INDEX, je ne peux pas retiré la valeur d'index entre parenthèses sans causer une erreur :-/
Et je suis vraiment obligé d'utiliser un text, impossible de passer en VARCHAR(255) puisqu'il s'agit d'un champs contenant parfois jusqu'à 3000 caractères...
Bref, si quelqu'un a une solution pour aider un pauvre stagiaire je suis tout ouï parce que là je déprime ^^
J'ai encore passé quelques heures dessus mais je suis vraiment bloqué là... J'ai touché tout ce que je pouvais avec les index mais rien ne fonctionne. Ca vient peut-être de l'indexation automatique/obligatoire pour les champs text mais je ne sais pas comment faire autrement puisque, même en indexant explicitement avec un INDEX, je ne peux pas retiré la valeur d'index entre parenthèses sans causer une erreur :-/
Et je suis vraiment obligé d'utiliser un text, impossible de passer en VARCHAR(255) puisqu'il s'agit d'un champs contenant parfois jusqu'à 3000 caractères...
Bref, si quelqu'un a une solution pour aider un pauvre stagiaire je suis tout ouï parce que là je déprime ^^
Salut!
Merci de ta réponse
En fait, j'avais rajouté les index à la main comme sur l'exemple du second lien, seulement il semblerait que ça ne marche pas avec les champs de type text. Peut-être à cause d'un conflit avec l'index qu'on est obligé de renseigné entre parenthèse (même problème avec les types text et blob).
Voilà ce que j'avais fais:
CREATE TABLE `apdu_simple` (
`NomCommandeAPDU` varchar(45) NOT NULL,
`CommandeAPDU` text NOT NULL,
PRIMARY KEY (`NomCommandeAPDU`,`CommandeAPDU`(100)),
INDEX (`NomCommandeAPDU`,`CommandeAPDU`(100)),
CONSTRAINT `FK_APDU-Simple` FOREIGN KEY (`NomCommandeAPDU`,`CommandeAPDU`(100))
REFERENCES `apdu`(`NomCommandeAPDU`,`CommandeAPDU`)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Mais ça me faisait la même erreur.
Merci beaucoup pour l'info de la taille des VARCHAR. Moi je m'étais arrêté à une taille maximum de 255 ^^ Avec un VARCHAR ça fonctionne impec :) Seulement j'ai un autre problème maintenant. J'ai voulus donné une taille de 5000 à mon VARCHAR pour être tranquille mais ça ne marche pas. Voilà l'erreur:
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
D'après le message et à la suite de plusieurs essais, je ne peux pas donner de taille supérieur à 767 à mon VARCHAR. J'avoue ne pas trop comprendre pourquoi cette taille spécifiquement... Pour information j'utilise comme version: Ver 14.12 Distrib 5.0.51b, for Win32.
Je vais voir si je ne trouve pas la solution quelque part et si c'est le cas j'éditerais. Mais je suis toujours ouvert à toutes nouvelles informations et/ou solutions ^^
Merci beaucoup de ta réponse en tous cas, ça m'a déjà pas mal avancé :)
Merci de ta réponse
En fait, j'avais rajouté les index à la main comme sur l'exemple du second lien, seulement il semblerait que ça ne marche pas avec les champs de type text. Peut-être à cause d'un conflit avec l'index qu'on est obligé de renseigné entre parenthèse (même problème avec les types text et blob).
Voilà ce que j'avais fais:
CREATE TABLE `apdu_simple` (
`NomCommandeAPDU` varchar(45) NOT NULL,
`CommandeAPDU` text NOT NULL,
PRIMARY KEY (`NomCommandeAPDU`,`CommandeAPDU`(100)),
INDEX (`NomCommandeAPDU`,`CommandeAPDU`(100)),
CONSTRAINT `FK_APDU-Simple` FOREIGN KEY (`NomCommandeAPDU`,`CommandeAPDU`(100))
REFERENCES `apdu`(`NomCommandeAPDU`,`CommandeAPDU`)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Mais ça me faisait la même erreur.
Merci beaucoup pour l'info de la taille des VARCHAR. Moi je m'étais arrêté à une taille maximum de 255 ^^ Avec un VARCHAR ça fonctionne impec :) Seulement j'ai un autre problème maintenant. J'ai voulus donné une taille de 5000 à mon VARCHAR pour être tranquille mais ça ne marche pas. Voilà l'erreur:
ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes
D'après le message et à la suite de plusieurs essais, je ne peux pas donner de taille supérieur à 767 à mon VARCHAR. J'avoue ne pas trop comprendre pourquoi cette taille spécifiquement... Pour information j'utilise comme version: Ver 14.12 Distrib 5.0.51b, for Win32.
Je vais voir si je ne trouve pas la solution quelque part et si c'est le cas j'éditerais. Mais je suis toujours ouvert à toutes nouvelles informations et/ou solutions ^^
Merci beaucoup de ta réponse en tous cas, ça m'a déjà pas mal avancé :)
Bon, en fait je ne peux pas éditer mon message donc je poste à la suite...
Alors en fait le problème vient de la taille de la clé. Sous InnoDB elle ne peut théoriquement pas dépasser 767 octets. Mais apparemment ça dépendrait des versions de mySQL puisque cette limitation ne semble pas effective chez tout le monde.
J'imagine que cette taille maximum peut-être changée quelque part dans les fichiers de conf et/ou dans les variables globales mais je n'ai pas encore trouvé où. Si quelqu'un sait où on modifie ce genre de données je suis preneur :)
Alors en fait le problème vient de la taille de la clé. Sous InnoDB elle ne peut théoriquement pas dépasser 767 octets. Mais apparemment ça dépendrait des versions de mySQL puisque cette limitation ne semble pas effective chez tout le monde.
J'imagine que cette taille maximum peut-être changée quelque part dans les fichiers de conf et/ou dans les variables globales mais je n'ai pas encore trouvé où. Si quelqu'un sait où on modifie ce genre de données je suis preneur :)
Je n'ai pas trouvé où on peut bien modifier cette valeur... :( J'ai cherché dans les fichiers .ini mais je n'ai rien trouvé dans les configurations des tables innodb :-/
Pourtant je pense qu'il y a moyen de changer la valeur mais pour le moment je sèche... Si une âme charitable a une idée qu'il n'hésite pas à se manifester ^^
Pourtant je pense qu'il y a moyen de changer la valeur mais pour le moment je sèche... Si une âme charitable a une idée qu'il n'hésite pas à se manifester ^^
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
26 juin 2008 à 20:06
26 juin 2008 à 20:06
Hello,
Apparemment ça dépend des versions de MySQL (normalement c'est un peu plus, genre du 1024). Ca n'a pas l'air configurable, et la seule solution que j'ai trouvée est de réduire la taille de tes clés (tu peux conserver une grande taille pour tes champs, et brider ces champs pour les clés).
http://www.calivia.com/blog/mike/mysql-innodb-specified-key-was-too-long-when-using-utf8-encoding
Mais es-tu vraiment obligé d'utiliser ces champs comme clé? Ne peux-tu pas plutôt associer ces deux champs dans une table de jointure possédant elle-même une clé primaire simple?
En effet, je comprends parfaitement que MySQL bride ce genre de clé car ça signifie que le sgbd doit comparer plus de 1000 caractères un par un (en utf-8 ça fait entre 8000 et 64000 comparaisons binaires) avant de pouvoir déterminer si ta clé est la bonne. Utiliser des chaines de quelques caractères comme clé n'est pas trop coûteux pour le sgbd, mais quand les clés deviennent énormes comme les tiennes, il est peut-être sage de passer par des entiers.
Cordialement
Apparemment ça dépend des versions de MySQL (normalement c'est un peu plus, genre du 1024). Ca n'a pas l'air configurable, et la seule solution que j'ai trouvée est de réduire la taille de tes clés (tu peux conserver une grande taille pour tes champs, et brider ces champs pour les clés).
http://www.calivia.com/blog/mike/mysql-innodb-specified-key-was-too-long-when-using-utf8-encoding
Mais es-tu vraiment obligé d'utiliser ces champs comme clé? Ne peux-tu pas plutôt associer ces deux champs dans une table de jointure possédant elle-même une clé primaire simple?
En effet, je comprends parfaitement que MySQL bride ce genre de clé car ça signifie que le sgbd doit comparer plus de 1000 caractères un par un (en utf-8 ça fait entre 8000 et 64000 comparaisons binaires) avant de pouvoir déterminer si ta clé est la bonne. Utiliser des chaines de quelques caractères comme clé n'est pas trop coûteux pour le sgbd, mais quand les clés deviennent énormes comme les tiennes, il est peut-être sage de passer par des entiers.
Cordialement
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Je suis d'accord avec toi seulement je suis dans un cas... particulier ^^
Disons que le programme de "remplissage" de la base est déjà créé donc je ne peux pas modifier les champs comme je le veux. De même, les tables existaient et moi je dois seulement mettre en place un programme de maintenance de cette base. Pour faciliter les choses je rajoute des contraintes dans la base type Foreign Key, Cascade, etc... Mais la base en elle même existe ;)
Mais bon, j'ai trouvé une solution détournée: Je vais compresser ma chaine en entrée (ce qui va m'obliger à un peu modifier le programme d'entrée mais c'est pas grave). Normalement ça ne devrait jamais dépasser les 550 caractères donc ça sera bon :) C'est tordu mais je ne vois pas d'autre solution... ^^
Merci beaucoup en tous cas pour tes réponses!
Bonne journée à tous :)
Disons que le programme de "remplissage" de la base est déjà créé donc je ne peux pas modifier les champs comme je le veux. De même, les tables existaient et moi je dois seulement mettre en place un programme de maintenance de cette base. Pour faciliter les choses je rajoute des contraintes dans la base type Foreign Key, Cascade, etc... Mais la base en elle même existe ;)
Mais bon, j'ai trouvé une solution détournée: Je vais compresser ma chaine en entrée (ce qui va m'obliger à un peu modifier le programme d'entrée mais c'est pas grave). Normalement ça ne devrait jamais dépasser les 550 caractères donc ça sera bon :) C'est tordu mais je ne vois pas d'autre solution... ^^
Merci beaucoup en tous cas pour tes réponses!
Bonne journée à tous :)
Marco la baraque
Messages postés
996
Date d'inscription
vendredi 9 mai 2008
Statut
Contributeur
Dernière intervention
5 novembre 2009
329
27 juin 2008 à 14:20
27 juin 2008 à 14:20
Salut,
Ok pour tes explications.
Qu'appelles tu "compresser ma chaine en entrée" ? Pourquoi n'utilises-tu pas les 350 premier caractères seulement? Ils ne sont pas assez significatifs ?
Cordialement.
Ok pour tes explications.
Qu'appelles tu "compresser ma chaine en entrée" ? Pourquoi n'utilises-tu pas les 350 premier caractères seulement? Ils ne sont pas assez significatifs ?
Cordialement.
En gros en entrée j'ai des commandes en valeurs hexadécimales sous cette forme:
"6D CE A2 BA 53 ED 46 A7 FA 84 7A A5 70"
Pouvant aller jusqu'à environ 900 octets (Plutôt 850 même en fait. Et je m'étais trompé quand j'avais dis plusieurs milliers, je me suis renseigné auprès de personnes plus "qualifiés" ^^). En supprimant simplement les espaces ça me donne une longueur maximal d'environ 900 - 900/3 soit 600 octets. Ce qui rentre dans les limites des tables InnoDB (en tous cas chez moi puisque cette limite se situe à 767 octets).
Et non, il me faut vraiment tous les caractères puisqu'il arrive que des commandes diffèrent par leur derniers caractères.
Voilà voilà! Je peux maintenant retourner à script de maintenance et vérification d'intégrité. C'est chiant à écrire ces trucs là encore mais au moins je ne bloque jamais bien longtemps quand j'ai un problème ^^
Merci encore pour ton aide.
Bonne soirée :)
"6D CE A2 BA 53 ED 46 A7 FA 84 7A A5 70"
Pouvant aller jusqu'à environ 900 octets (Plutôt 850 même en fait. Et je m'étais trompé quand j'avais dis plusieurs milliers, je me suis renseigné auprès de personnes plus "qualifiés" ^^). En supprimant simplement les espaces ça me donne une longueur maximal d'environ 900 - 900/3 soit 600 octets. Ce qui rentre dans les limites des tables InnoDB (en tous cas chez moi puisque cette limite se situe à 767 octets).
Et non, il me faut vraiment tous les caractères puisqu'il arrive que des commandes diffèrent par leur derniers caractères.
Voilà voilà! Je peux maintenant retourner à script de maintenance et vérification d'intégrité. C'est chiant à écrire ces trucs là encore mais au moins je ne bloque jamais bien longtemps quand j'ai un problème ^^
Merci encore pour ton aide.
Bonne soirée :)
25 juin 2008 à 22:17
Depuis MySQL 5.0.3 les varchar peuvent contenir jusqu'à 65,535 caractères (https://dev.mysql.com/doc/refman/8.0/en/char.html), donc je te conseille de les utiliser.
Ton erreur apparait à cause des index que tu n'as pas écrit.
Tu as un exemple dans la doc MySQL pour écrire un index sur une clé composite (https://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html)
Tiens nous au courant.
Cordialement.