Mémo MySQL

Ce billet date de plusieurs années, ses informations peuvent être devenues obsolètes.

Mise à jour : attention, pour un support complet d'Unicode, utilisez utf8mb4 !

Regardez c'est ouf, on dirait que Batman s'est fait mettre à l'amende !

Et à part ça ? Et bien on va parler de MySQL aujourd'hui car j'ai besoin de rassembler quelques notes et j'ai pensé qu'il serait bien à propos de les publier ici même.

MySQL via Mac Porc

Pour avoir la dernière version de MySQL plutôt que celle shipée avec Mac OS X sans vous prendre trop la tête, vous pouvez utiliser MacPorts par exemple. Comme ça en plus, vous aurez le temps d'aller acheter un kebab pendant que ça compilera sa race. C'est toujours plus sûr d'avoir la même version d'un soft en prod et en dev. Bon, donc installation, config, démarrage et arrêt :

sudo port install mysql5 +server
sudo -u mysql mysql_install_db5
sudo /opt/local/bin/mysqld_safe5 &
/opt/local/bin/mysqladmin5 -u root -p shutdown

N'oubliez pas de set un password robuste pour l'utilisateur root, moi je le fais jamais en local car je suis trop w34k, mais ne faites pas ça chez vous les enfants.

D'autres tips sont disponibles dans les posts Install and configure MySQL 5 with MacPorts et Installing MySQL on Mac OS X Leopard using MacPorts

Grendizer VS UTF-8

L'UTF-8, c'est tellement merveilleux... quand ça marche. Dans MySQL ça marche pas tout seul par défaut. Il va falloir aller modifier la config d'abord. La conf se trouve ici sous Ubuntu : /etc/mysql/my.cnf. Sous Mac OS X, si vous avez installé MySQL via MacPorts, vous pouvez faire un cp d'une conf qui se trouve dans /opt/local/share/mysql5/mysql/ vers /opt/local/etc/mysql5/, soit par exemple :

sudo cp /opt/local/share/mysql5/mysql/my-medium.cnf /opt/local/etc/mysql5/my.cnf

Puis faire les modifications que vous jugerez nécessaires :

mate /opt/local/etc/mysql5/my.cnf
[mysqld]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8

Et puis re-starter le serveur.

Parmis mes sources sur ce sujet il y a Django+Mysql: How to Fix Unicode (Aka Mysterious Question Marks) et MacPorts + MySQL.

Si vous devez passer par un ALTER pour faire du neuf avec de l'ancien :

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8;

Pour vous renseigner sur UTF-8, il existe des tonnes d'articles et de posts sur Unicode. Une des meilleures intro à mon sens est une page du wiki de... Second Life.

I Like To Move It Move It

Après quelques lectures et des discussions avec des potos, j'ai réfléchi et j'ai trouvé que déplacer sa database c'était plutôt un truc cool :D

Donc si vous avez un gros disque data, genre bien plus gros que votre disque système, genre un disque de bonhomme, déplacez vos bases : How to move mysql database to another drive or partition. Après ça, vous aussi vous aimerez le bouger bouger.

Dump it baby

Et il y a toujours ces commandes qu'on oublie tout le temps pour dumper ou restorer une base de donnée sous MySQL :

/opt/local/lib/mysql5/bin/mysqldump -u username -p databasename > ~/Desktop/dump.sql
/opt/local/bin/mysql5 -u username -p databasename < dump.sql

Une petite collation ?

Il y a des moments difficiles à passer avec MySQL. L'un d'eux est votre première rencontre avec les collations, c'est à dire l'ensemble de règles qui permettent la comparaison de caractères.

Ce n'est pas seulement important pour des questions de tri, mais aussi pour des questions de contraintes d'intégrité. Si vous ne voulez pas que MySQL considère que le mot héhe est le même mot que hehe, il y a des chances que vous entendiez parler de la collation utf8_bin. La documentation de Django à ce propos étant bien foutue, j'ai rapidement pu m'orienter vers cette solution.

Pour changer la collation sur une table existante :

ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;

Cette façon d'ordonner est bien moisie !

En bon n00bz0r, je me suis bien fait balader par le concept de la valeur NULL dans MySQL. D'autres sont passés par là et proposent des solutions pour ne pas sortir les résultats NULL avant les résultats NOT NULL dans un ORDER ASC : MySQL Sort Order with NULL, MySQL Sort Order with NULL, MySQL - order by relevance.

En gros, un bon gruik familial pourrait ressembler à ça :

SELECT toto, toto = '' AS empty_toto FROM table ORDER BY empty_toto, toto;

Avant PopCornPages.org Après Le piège du JavaScript

Tag Kemar Joint