Je pense que c'est les seules méthodes. L'idée étant de ne jamais
utiliser ENUM. C'est quelque chose d'assez grotesque et qui n'est pas
assez souple, comme tu viens de le constaté.

Le 19 janvier 2009 00:34, Johan Cwiklinski <jo...@x-tnd.be> a écrit :
> Salut,
>
> Il y a quelque temps, le codage des caractères dans Galette est passé de
> ISO à UTF-8.
>
> Hormis quelques soucis mineurs, il me semble qu'il n'y a plus de
> problèmes sauf... La mise à jour depuis une ancienne version.
>
> En effet, sous MySQL, chaque base/table/champ possède son propre
> encodage ; il faut donc les modifier un par un, mais cela ne suffit pas,
> puisque les données enregistrées restent en ISO.
> Il faut donc, pour chaque table, convertir chaque champ texte en UTF
> (s'il ne l'est pas déjà). J'ai ajouté sur le SVN deux méthodes dans la
> classe mdb2 qui se chargent de tout cela.
>
> J'ai cependant rencontré un problème avec le type ENUM.
> Enum est un type texte, reconnu comme tel par MDB2. Le problème était
> qu'en parsant les champs, je me suis retrouvé incapable de faire une
> requête alter qui ne modifie pas le type en varchar (voire text) ; ce
> qui n'était pas souhaitable.
>
> Du fait, et au vu de l'utilisation du type enum dans la base de Galette,
> j'ai décidé de remplacer les quelques occurrences par du tinyint(1).
>
> Voilà pour les explications et le contexte.
>
> J'ai donc une requête du genre :
> ALTER TABLE `galette_adherents` CHANGE `activite_adh` `activite_adh`
> TINYINT( 1 ) NOT NULL DEFAULT 0;
>
> Qui ne fonctionne pas comme je m'y attendais... Dans les bases que j'ai
> testées, l'application de cette requête passe les valeurs de 0 à 1 ; et
> visiblement de 1 à 2... Du coup, Galette se prend les pieds dans le tapis.
>
> Si j'en crois cet article :
> http://www.olivierdoucet.info/blog/?post/2008/09/18/Stocker-un-booleen-dans-MySQL
> ; MySQL va me prendre le seul type numérique qu'il connaît pour stocker
> mon tinyint, à savoir l'index du tableau (puisque '0' n'est pas 0 et
> n'est donc pas un entier...). Ça se confirme avec la doc MySQL :
> http://dev.mysql.com/doc/refman/5.0/en/enum.html
>
> Ce problème ne se pose que pour le champ activite_adh... En effet on a :
> enum('0', '1')
> qui correspond au tableau  :
> 1=>'0'
> 2=>'1'
> Pour les autres champs qui utilisent enum, on a simplement :
> enum('1')
> qui correspond au tableau :
> 1 => '1'
>
> La seule solution que j'ai trouvée consiste à passer d'abord ce champ en
> type varchar, pour ensuite le passer en tinyint, et là, pas de soucis :
> ALTER TABLE `galette_adherents` CHANGE `activite_adh` `activite_adh`
> VARCHAR( 1 ) NOT NULL DEFAULT 0;
> ALTER TABLE `galette_adherents` CHANGE `activite_adh` `activite_adh`
> TINYINT( 1 ) NOT NULL DEFAULT 0;
>
> Il resterait la solution "barbare" :
> UPDATE `galette_adherents` SET `activite_adh`=0 WHERE `activite_adh`=1
> UPDATE `galette_adherents` SET `activite_adh`=1 WHERE `activite_adh`=2
>
> Ces deux façons de faire ne me plaisent guère, quelqu'un aurait-il une
> idée ou une autre solution à proposer ?
>
> Merci,
> Johan
>
>
> _______________________________________________
> Galette-devel mailing list
> Galette-devel@gna.org
> https://mail.gna.org/listinfo/galette-devel
>
>



-- 
Bellière Ludovic

_______________________________________________
Galette-devel mailing list
Galette-devel@gna.org
https://mail.gna.org/listinfo/galette-devel

Répondre à