mail[Galette-devel] MySQL : alter sur type ENUM


Others Months | Index by Date | Thread Index
>>   [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Header


Content

Posted by Johan Cwiklinski on January 19, 2009 - 00:34:
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

Attachment: signature.asc
Description: OpenPGP digital signature


Related Messages


Powered by MHonArc, Updated Mon Jan 19 08:20:23 2009