Manuel complet sur MySQL

Manuel complet sur MySQL avec exemples de pratique
...
1 Informations générales à propos de MySQL
Ceci est la manuel de référence de MySQL; il correspond à la version 3.23.2-alpha de MySQL. MySQL est un langage rapide, multi-threaded, multi-utilisateur, c'est aussi un serveur de base de données SQL robuste (Structured Query Language). Pour les plates-formes Unix et OS/2, MySQL est libre; pour les plates-formes Microsoft il est nécessaire d'acquitter une licence après un temps d'essai de 30 jours. Confère section 3 Support et licences MySQL). The MySQL home page fournit les dernières informations concernant MySQL.
Pour une description des capacités de MySQL, section 1.4 Caractéristiques de MySQL. Pour les instructions d'installation, cf. section section G Commentaires sur le portage vers d'autres systèmes d'exploitation. Pour une information sur la mise à jour de la version 3.21, section 4.16.2 Mise à jour de a 3.21 vers 3.22. Pour un exemple complet, section 8 Exemple MySQL. Pour des informations sur SQL et les benchmark, reportez vous au dossier de benchmark. Dans les distributions source, il est situé dans le dossier ``bench'' .
Dans les distributions compilées, il est situé dans le dossier ``sql-bench'' Pour un historique des caractéristiques et des bogues corrigés, section D Historique des versions de MySQL. Pour une liste des bogues connus et des lacunes de MySQL, section E Erreurs connues et manques de MySQL. Pour les prochaines fonctionnalités, section F Liste de voeux pour les versions futures de MySQL (la TODO). Pour la liste de tous les contributeurs à ce produit, section C Contributions à MySQL. IMPORTANT: Envoyer les bugs ou erreurs, questions ou commentaires à la liste de diffusion : ... . Confère section 2.3 Comment rapporter des bugs et des problèmes.
Dans les distributions source, le script mysqlbug est rangé dans le dossier ``scripts''. Dans les distributions compilées, mysqlbug est rangé dans le dossier ``bin''. Si vous avez des suggestions concernant les ajouts de fonctionnalités ou corrections à ce manuel, envoyer les à la liste de diffusion (en anglais), avec le sujet suivant : documentation suggestion : [Insert topic here]. Confère section 2.1 Les listes de diffusion MySQL
1.1 Qu'est ce que MySQL?
MySQL est un véritable serveur de base de données SQL multi-utilisateur et multi-threaded. SQL est le plus populaire langage de base de données dans le monde. MySQL est une configuration client/serveur ce qui consiste en un serveur démon mysqld, différents programmes clients et des librairies. SQL est un langage standardisé qui rend facile le stockage, la mise à jour et l'accès à l'information. Par exemple, vous pouvez utiliser le SQL pour récupérer des informations sur un produit ou stocker des informations client sur un site web. MySQL est suffisamment rapide et flexible pour gérer des historiques et des images. Les principaux objectifs de MySQL sont la rapidité, la robustesse et la facilité d'utilisation. MySQL a été originellement développé parce que nous au TcX avions besoin d'un serveur SQL qui puisse gérer des grandes bases de données de manière plus rapide que ce que pouvaient offrir les distributeurs de bases de données. Nous utilisons donc MySQL depuis 1996 dans un environnement de plus de 40 bases de données contenant 10,000 tables, dont plus de 500 contiennent plus de 7 millions d'enregistrements. C'est environ 100 giga octets de données critiques. La base sur laquelle MySQL est construite est un ensemble de routines qui ont été largement éprouvées pendant des années dans un environnement de production exigeant. Même si MySQL est encore en développement, il propose déjà un ensemble de fonctionnalités riches et extrêmement utiles. La prononciation classique de MySQL est ``Maille Ess Ku Ell''
1.3 Historique de MySQL
Nous avions l'intention d'utiliser mSQL pour nous connecter à nos tables, tout en utilisant nos propres routines (ISAM). Après plusieurs tests, nous sommes parvenus à la conclusion que mSQL n'était ni assez rapide, ni suffisamment flexible pour nos besoins. Le résultat a été le codage d'une nouvelle interface SQL pour notre base avec la plupart des API de mSQL. Ces API ont été choisies pour faciliter le portage sur des codes tiers. La dérivation du nom MySQL n'est pas parfaitement claire. Notre arborescence et un certain nombre de nos librairies et outils commencaient par le préfixe "My" depuis quelques années déjà. Et auparavant, la soeur de Monty était surnommée My. A part ces deux anecdotes, le nom de MySQL est encore un mystère, pour nous aussi.
1.4 Caractéristiques de MySQL
La liste suivante décrit quelques caractéristiques importantes de MySQL:
Complètement multi-threaded en utilisant les threads du noyau. Cela signifie qu'il peut utiliser plusieurs CPU.
C, C++, Eiffel, Java, Perl, PHP, Python et TCL APIs. Confère section 20 API MySQL.
Fonctionne sur différentes plates-formes. Confère section 4.2 Systèmes d'exploitation supportés par MySQL.
Plusieurs types de colonnes: entier signé/non-signé 1, 2, 3, 4et 8 bytes long, FLOAT, DOUBLE, CHAR, VARCHAR, TEXT, BLOB, DATE, TIME, DATETIME, TIMESTAMP, YEAR, SET et ENUM types. Confère section 7.2 Types de colonnes.
Jointures ultra rapides, grâce à un optimiseur de jointures à une passe.
Les requêtes SELECT et WHERE supportent tous les opérateurs et fonctions. Exemple:
mysql> SELECT CONCAT(first_name, " ", last_name) FROM nom_table
WHERE income/dependents > 10000 AND age > 30;
Les fonctions SQL sont implémentées à travers des classes de librairies extrêmement optimisées et devraient
fonctionner aussi vite qu'elles peuvent! En général il n'y a plus d'allocation mémoire après une requête d'initialisation.
Support pour les clauses des instructions SQL GROUP BY et ORDER BY . Support pour le groupe d'instructions (COUNT(), COUNT(DISTINCT), AVG(), STD(), SUM(), MAX() et MIN()).
Support pour LEFT OUTER JOIN avec la syntaxe ANSI SQL et ODBC.
Le mélange des tables de différentes bases de données est supporté dans une même requête (après la version 3.22).
Système flexible et sécurisé de droits et de mots de passe, et qui autorise une vérification faites sur l'hôte. Les mots de passe sont sécurisés depuis que la gestion des mots de passe est crypté entre le client et le serveur.
ODBC (Open-DataBase-Connectivity) pour Windows95 (avec source). Toutes les fonctions ODBC 2.5 et d'autres.
Vous pouvez, par exemple, utiliser Access pour vous connecter au serveur MySQL. Confère section 16 MySQL et ODBC
Tables rapides à B-tree avec compression des index.
16 index par tables sont autorisés. Chaque index consiste en 1 et 15 colonnes ou parties de colonnes. La longueur maximale d'un index est de 256 bytes (ceci peut être modifié lors de la compilation MySQL). Un index devrait
utiliser un préfixe CHAR ou VARCHAR .
Enregistrements de longueur fixe ou variable.
Les Tables de hashage en mémoire, qui sont utilisées comme des tables temporaires.
Gestion de grandes bases de données. Nous utilisons MySQL avec des bases de 50,000,000 enregistrements.
Toutes les colonnes ont des valeurs par défaut. Vous pouvez utiliser INSERT pour insérer un ensemble de colonnes; les colonnes qui n'ont de valeurs explicites sont initialisées à leur valeur par défaut.
Utilise GNU Automake, Autoconf et libtool pour la portabilité.
Ecrit en C et C++. Testé avec un nombre conséquent de compilateurs différents.
Système efficace d'allocation mémoire thread-based.
Pas de perte de mémoire. Testé avec un détecteur de perte de mémoire commercial (purify).
Inclus isamchk, un utilitaire rapide pour le contrôle, l'optimisation et la réparation des tables. Confère section 13
Maintenance d'un serveur MySQL
Support de l' ISO-8859-1 Latin1. Par exemple, les caractères scandinaves @ringaccent{a}, @"a and @"o sont autorisés dans le nom des tables et des colonnes.
Toutes les données sont sauvegardées sous le format ISO-8859-1 Latin1. Les comparaisons de colonnes en chaînes de caractères normales sont "insensible à la casse".
Le tri est cohérent avec la norme ISO-8859-1 Latin1. Il est possible de le changer dans le source en ajoutant un nouveau tableau de tri. Pour voir un exemple de tri avancé, regardez le code Tchèque. MySQL supporte différentes polices qui peuvent être spécifiées à la compilation.
Alias sur les tables et colonnes comme dans le standard SQL92.
DELETE, INSERT, REPLACE et UPDATE retournent le nombre de lignes traitées.
Les noms de fonction restent disponibles pour les tables et les colonnes. Par exemple, ABS reste un nom de colonne valide. L'unique restriction est que lors de l'appel d'une fonction, les espaces entre le nom de la fonction et les parenthèses '(' qui suivent ne sont pas autorisées. Confère section 7.30 Mots reservés par MySQL
Tous les programmes de MySQL dispose d'une aide en ligne, accessible grâce à l'option --help ou -?.
Le serveur peut fournir au client les messages d'erreurs en plusieurs langues. Confère section 9.1 Quels sont les
langues supportées par MySQL?.
Les clients se connectent au serveur MySQL en utilisant les connexions TCP/IP, les sockets Unix ou les pipes nommés sous NT.
La commande spécifique à MySQL SHOW peut être utilisée pour avoir des informations concernant les bases de données, les tables et les index. La commande EXPLAIN peut être utilisée pour déterminer comment l'optimiseur résout la requête.
1.5 Est ce que MySQL est stable?
Cette section répond aux questions "Qu'elle est la stabilité de MySQL?'' et, ``Puis-je faire confiance à MySQL sur ce projet?''. Nous allons essayer de clarifier quelques problèmes et répondre aux questions les plus importantes qui concernent une majorité de personnes. Cette section rassemble les informations récoltées dans la liste de diffusion (qui est très active dans l'identification des bogues). A TcX, MySQL fonctionne depuis mi-1996 sans aucun problème. Lorsque MySQL a été diffusé auprès du grand public, un certain nombre de codes n'avaient pas été testés et ils ont été vite identifiés par les nouveaux utilisateurs qui ont utilisé les requêtes d'une manière différente de la notre. Chaque nouvelle release a moins de problèmes de portabilité que la précédente (même si à chaque fois de nouvelles fonctionnalités sont identifiées), et nous espérons bientôt qu'une prochaine version sera labellisée "Stable". Chaque release de MySQL est utilisable et il n'y a de problèmes uniquement lorsque les utilisateurs commencent à utiliser les "zones d'ombres". Naturellement, il est difficile de connaître le contenu de ces zones d'ombres; cette section a pour objectif d'identifier les zones connues. La description concerne la version 3.22.x de MySQL. Tous les bogues connus sont corrigés dans la dernière version, à l'exception de la liste des bogues répertoriés dans la section des erreurs. Cf. section Confère section E Erreurs connues et manques de MySQL.
MySQL est décomposé en plusieurs couches et différents modules indépendants.
Les modules sont listés ci-dessous avec leur état de stabilité :
Le gestionnaire de tables ISAM -- Stable
Il gère le stockage et la lecture de toutes les données. Dans toutes les releases de MySQL, un seul bogue a été reporté. La seule façon connue d'avoir une table corrompue est de "tuer" le serveur au milieu de la mise à jour. Et même un tel scénario ne détruira probablement pas toutes les données sans qu'il soit possible de les récupérer, car toutes les données sont vidées de la mémoire, entre chaque requête. Il n'y a jamais eu de bogues liés à la destruction de données.
L'analyseur syntaxique et l'analyseur lexical -- Stable
Il n'y a pas un seul bogue d'identifié depuis longtemps dans ce module.
Le code du client C -- Stable
Pas de problèmes connus. Dans la version précédente 3.20, il y avait quelques limites dans la taille du buffer d'envoi/réception. Depuis de la 3.21.x, la taille du buffer est maintenant dynamique et initialisé par défaut à 24M.
Programmes clients standards -- Stable
Cela inclus mysql, mysqladmin et mysqlshow, mysqldump, et mysqlimport.
Basic SQL -- Stable
Système de fonction basic SQL, classes de chaînes de caractères et gestion dynamique de la mémoire. Pas de bogues identifiés.
Optimiseur de requête -- Gamma
Optimiseur d'intervalle – Stable
Optimiseur de jointure -- Stable
Verrouillage – Gamma
Cela est très dépendant du système. Sur certains systèmes il y a de gros problèmes en utilisant le verrouillage standard de l'OS (fcntl()). Dans ces cas là, vous devriez faire fonctionner le démon MySQL avec l'option --skiplocking. Les problèmes sont connus, sur quelques systèmes Linux et sur SunOS lorsque le gestionnaire de fichiers est monté sur NFS.
Linux threads -- Gamma
Le seul problème identifié concerne l'appel de la fonction fcntl(), qui est résolu en utilisant l'option --skip-locking de mysqld. Quelques personnes ont reporté des problèmes avec la version release 0.5.
Solaris 2.5+ pthreads -- Stable
Nous l'utilisons pour nos systèmes en production.
MIT-pthreads (autres systèmes) – Gamma
Il y a pas de bogues identifiés depuis la 3.20.15 et la 3.20.16. sur quelques systèmes, il y a un disfonctionnement . Quelques opérations sont assez lentes (un arrêt de 1/20 second est effectué entre chaque requête). Bien sur, MITpthreads peut ralentir un peu l'ensemble, mais les commandes SELECT qui utilisent des index sont faites en un laps de temps tellement court, que le verrouillage et l'échange de thread n'est pas nécessaire.
Autres implémentations -- Alpha - Beta
Le portage sur d'autres systèmes restent assez nouveau et ont peut-être des bugs, probablement dans le serveur MySQL, et plus certainement dans l'implémentation des threads.
LOAD DATA ..., INSERT ... SELECT -- Stable
Quelques personnes ont cru identifier des bogues dans ce module, c'était lié à une méprise. Vérifier la documentation sur le sujet!
ALTER TABLE -- Gamma
Changements mineures dans la 3.22.12.
DBD -- Gamma
Maintenant maintenu par Jochen Wiedmann
mysqlaccess -- Gamma
Ecrit et maintenu par Yves Carlier
GRANT -- Beta
Gros changement dans la MySQL 3.22.12.
MyODBC (utilise ODBC SDK 2.5) -- Beta
Il fonctionne normalement avec la plupart des programmes.
TcX fournit un support payant par email, cependant la mailing liste MySQL répond à la plupart des questions. Les bogues sont en général corrigés par des patchs; pour les bogues plus importants, il y a de nouvelles versions.
1.6 Compatibilité an 2000
MySQL lui-même n'a pas de problémes avec la compatibilité An 2000 (Y2K):
- MySQL utilise les fonctions de gestion du temps d'Unix et n'a pas de problèmes jusqu'en 2069; toutes les années sur 2-digit sont comprises entre 1970 et 2069, cela qui signifie que si vous stocker 01 dans une colonne année, MySQL le traite comme 2001.
- Toutes les fonctions de date de MySQL sont stockées dans un fichier unique ``sql/time.cc'' et codées pour être compatible An 2000.
- Dans la version 3.22 de MySQL et les versions ultérieures, le nouveau type de colonne Année peut stocker des années entre 0 et 1901 jusqu'à 2155 sur 1 byte et éditer sur 2 ou 4 digits.
Vous pouvez avoir des problèmes avec des applications qui utilisent MySQL mais non compatible An 2000. Malheureusement ces problèmes sont difficilement corrigibles lorsque ces applications sont écrites par différents programmeurs et que chacun utilise ses propres conventions pour gérer les dates. Vous trouverez ci-après une démonstration simple qui illustre le fait que MySQL n'a aucun problème avec les dates jusqu'en 2030!
mysql> DROP TABLE IF EXISTS y2k;
mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp);
mysql> INSERT INTO y2k VALUES ("1998-12-31","1998-12-31
23:59:59",19981231235959);
mysql> INSERT INTO y2k VALUES ("1999-01-01","1999-01-01
00:00:00",19990101000000);
mysql> INSERT INTO y2k VALUES ("1999-09-09","1999-09-09
23:59:59",19990909235959);
mysql> INSERT INTO y2k VALUES ("2000-01-01","2000-01-01
00:00:00",20000101000000);
mysql> INSERT INTO y2k VALUES ("2000-02-28","2000-02-28
00:00:00",20000228000000);
mysql> INSERT INTO y2k VALUES ("2000-02-29","2000-02-29
00:00:00",20000229000000);
mysql> INSERT INTO y2k VALUES ("2000-03-01","2000-03-01
00:00:00",20000301000000);
mysql> INSERT INTO y2k VALUES ("2000-12-31","2000-12-31
23:59:59",20001231235959);
mysql> INSERT INTO y2k VALUES ("2001-01-01","2001-01-01
00:00:00",20010101000000);
mysql> INSERT INTO y2k VALUES ("2004-12-31","2004-12-31
23:59:59",20041231235959);
mysql> INSERT INTO y2k VALUES ("2005-01-01","2005-01-01
00:00:00",20050101000000);
mysql> INSERT INTO y2k VALUES ("2030-01-01","2030-01-01
00:00:00",20300101000000);
mysql> INSERT INTO y2k VALUES ("2050-01-01","2050-01-01
00:00:00",20500101000000);
mysql> SELECT * FROM y2k;
…
mysql> DROP TABLE y2k;
Cela montre que le type DATE et DATETIME sont compatibles, alors que le type TIMESTAMP, qui est utilisé pour stocker la date courante, est limitée au 2030-01-01. TIMESTAMP est compris entre 1970 et 2030 sur les machines 32- bits. Même si MySQL est compatible An 2000, il est de votre responsabilité de fournir une entrée correcte. Confère section 7.2.6.1 Bug de l'an 2000 et données de types date pour les règles appliquées par MySQL pour la gestion des entrées ambiguës de données (Donnée contenant des valeurs sur 2-digit).
… … …
2 La liste de diffusion MySQL et comment rapporter des bugs
2.1 Les listes de diffusion MySQL
Pour s'incrire sur la liste de diffusion (en anglais) de MySQL, envoyez un message à l'adresse suivante : ... . Pour se désinscrire de la liste de diffusion MySQL, envoyez un message à l'adresse suivante : ... Seule l'adresse d'origine de votre message sera utilisée. Le sujet et le contenu du mail sont ignorés. Si votre adresse de réponse n'est pas valide, vous pouvez la spécifier explicitement. Vous pouvez alors ajouter un signe tiret `-', suivi de votre adresse, dont l'arobase ... été remplacé par `='.
...
Des informations à propos de ezmlm sont disponibles à the ezmlm Website. Pour envoyer un message à la liste elle même, envoyez votre message à ... . Cependant, n'envoyez pas de message d'inscription ou de désinscription à ..., car les mails envoyés la bas sont automatiquement envoyé à des milliers d'utilisateurs. Votre site local peut disposer de sa propre base d'utilisateurs de... . Dans ce cas, il a peut être sa propre liste de diffusion, qui relaient les messages de lists.mysql.com. Dans ce cas, contactez votre administrateur pour être ajouté ou supprimé de la liste de diffusion. Les listes de diffusions suivantes existent :
annonces
Cette liste sert à annoncer les nouvelles versions de MySQL et des programmes associés. Elle a un faible traffic, et il est préférable que tous les utilisateurs y soient inscrit.
mysql
La liste principale de discussion à propos de MySQL. Notez bien que certains sujets sont traités dans des listes de diffusions séparées. Si vous postez un message sur une mauvaise liste, vous risquez de ne pas avoir de réponse.
mysql-digest
La liste mysql dans un format condensé. Cela signifie que tous les messages de la journée sont rassemblés en un grand message, mais une fois par jour.
java
Discussion à propos de MySQL et Java. Généralement, à propos des pilotes JDBC.
java-digest
La version condensée de la liste sur java.
win32
Tout ce qui concerne MySQL sur les OS Microsoft, comme par exemple Windows NT.
win32-digest
La version condensée de la liste sur win32.
myodbc
Tout ce qui concerne les connexions à MySQL avec ODBC.
myodbc-digest
La version condensée de la liste sur myodbc.
msql-mysql-modules
Tout ce qui concerne les connexions à MySQL avec Perl.
msql-mysql-modules-digest
La version condensée de la liste sur msql-mysql-modules.
developer
Une liste pour ceux qui travaille sur le code de MySQL.
developer-digest
La version condensée de la liste sur developer.
... ...
2.3 Comment rapporter des bugs et des problèmes
Ecrire un rapport de bug nécessite de la patience, mais ce premier geste va économiser votre temps, et le notre. Cette section vous aide à écrire votre rapport de bug correctement, de manière à ce que vous ne perdiez pas votre temps à écrire des messages qui ne nous servirons à rien. Nous vous encourageons à utiliser le script mysqlbug pour générer un rapport de bug (ou un rapport sur n'importe quel problème). mysqlbug est situés dans le dossier de la distribution source, ou, dans la distribution binaire, dans le dossier `bin' de votre dossier d'installation MySQL.Si vous ne pouvez pas utiliser mysqlbug, il est préférable d'inclure toutes les informations listées ci dessous. Le script mysqlbug vous aide à générer un rapport de bug en déterminant les informations suivantes automatiquement : mais si vous pensez que quelque chose d'important manque, ajoutez le au message. Relisez attentivement cette section, et assurez vous que toutes les informations décrites ci dessous sont incluses dans votre rapport. Gardez à l'esprit qu'il est toujours possible de répondre à un message qui contient trop d'information, alors que ce n'est pas possible avec un message qui en contient pas assez.
Souvent, les rapports omettent des informations car les utilisateurs pensent avoir compris les causes du problème et que certains détails sont insignifiants. Le bon principe est le suivant : Si vous doutez de quelque chose, dites le. Il est milles fois plus rapide d'ajouter quelques lignes dans votre rapport, plutôt que d'être forcé de le renvoyé encore une fois, pour complément d'information. L'erreur la plus répandue est que les utilisateurs n'indique pas le numéro de version de la distribution MySQL qu'ils utilisent, ou la plate forme sur laquelle ils opèrent (y compris la version de cette plate forme). C'est une information primordiale, et 99% des cas sont inexploitables sans cette information. Souvent, nous avons des questions du genre : ``Pourquoi est ce que ça plante chez moi?'' et nous nous aperçevons que cette fonctionnalité n'est pas disponible sur la version de MySQL utilisée, ou bien que le bug a été corrigé dans les versions plus récentes. Parfois, l'erreur dépend de l'OS. Dans ces cas, il est presque impossible de corriger l'erreur sans connaitre le nom de l'OS, et le numéro de version de la plate forme.