MySQL possède une interface SQL assez complexe, mais facile à apprendre. Ca chapitre décrit les différentes commandes, types, et fonctions que vous aurez besoin de connaître pour utiliser MySQL de façon optimale. Ce chapitre sert aussi de référence pour toutes les fonctionnalités incluses au sein de MySQL. Afin d'utiliser ce chapitre efficacement, vous pourrez trouver utile de vous reporter aux différents index.
Cette section décrit les différents façons d'écrire les chaînes et les nombres en MySQL. Elle couvre aussi les différentes nuances et quiproquos que vous pouvez rencontrer lorsque vous manipulez ces types de données.
Une chaîne est une séquence de caractères, entourée de guillemets simples (`'') ou doubles (`"') (simple seulement si vous êtes en mode ANSI). Exemples:
'une chaîne' "une autre chaîne"
A l'intérieur d'une chaîne, certains séquences de caractères ont une signification spéciale.
Chacune d'elle commence par un anti-slash (`\'), connu comme le caractère d'échappement.
MySQL reconnaît les séquences suivantes :
\0
NUL).
\'
\"
\b
\n
\r
\t
\z
mysql base < fichier.)
\\
\%
\_
Notez que si vous utilisez `\%' ou `\_' dans un contexte de chaînes de caractères, ces séquences retourneront `\%' et `\_' et non `%' et `_'.
Il y a plusieurs façons d'intégrer un guillemet dans une chaîne :
Le SELECT montré ici explique comment les guillemets et les échappements fonctionnent :
mysql> SELECT 'bonjour', '"bonjour"', '""bonjour""', 'bon''jour', '\'bonjour'; +---------+-----------+-------------+----------+----------+ | bonjour | "bonjour" | ""bonjour"" | bon'jour | 'bonjour | +---------+-----------+-------------+----------+----------+ mysql> SELECT "bonjour", "'bonjour'", "''bonjour''", "bon""jour", "\"bonjour"; +---------+-----------+-------------+----------+----------+ | bonjour | 'bonjour' | ''bonjour'' | bon"jour | "bonjour | +---------+-----------+-------------+----------+----------+ mysql> SELECT "Voilà\n3\nlignes"; +--------------------+ | Voilà 3 lignes | +--------------------+
Si vous voulez insérer des données binaires dans un champ chaîne (comme un
BLOB), les caractères suivants doivent être échappés :
NUL
\
'
"
Si vous écrivez du code C, vous pouvez utiliser la fonction mysql_real_escape_string(),
fournie par l'API, pour échapper les caractères pour les requêtes INSERT.
See section 8.4.2 Vue d'ensemble des fonctions de l'API C. Avec Perl, vous pouvez utiliser la méthode quote du package
DBI pour convertir les caractères spéciaux en leurs équivalents échappés.
See section 8.2.2 L'interface DBI.
Vous devez utiliser une fonction d'échappement pour chaque chaîne susceptible de contenir l'un des caractères spéciaux listés plus haut.
Alternativement, beaucoup d'API MySQL, fournissent des fonctionnalités qui vous
permettent d'insérer des marqueurs spéciaux dans une requête puis de les remplacer par
des valeurs lors de l'exécution de celle-ci. Dans ce cas, l'API s'occupe d'échapper les
caractères spéciaux pour vous.
Les entiers sont représentés comme une séquence de chiffres. Les décimaux utilisent `.' comme séparateur. Tous les types de nombres peuvent être précédés d'un `-' pour indiquer une valeur négative.
Exemples d'entiers valides :
1221 0 -32
Exemples de nombres à virgule flottante :
294.42 -32032.6809e+10 148.00
Un entier peut être utilisé dans un contexte décimal, il sera interprété comme le nombre décimal équivalent.
MySQL supporte les valeurs hexadécimales. Dans un contexte numérique, elles agissent comme des entiers (précision 64-bit). Dans un contexte de chaîne, elles agissent comme une chaîne binaire où chaque paire de caractères hexadécimaux est convertie en caractère :
mysql> SELECT x'4D7953514C';
-> MySQL
mysql> SELECT 0xa+0;
-> 10
mysql> SELECT 0x5061756c;
-> Paul
La syntaxe x'chaînehexa' (nouvelle en 4.0) est basée sur ANSI SQL et la syntaxe
0x est basée sur ODBC. Les chaînes hexadécimales sont souvent utilisée par ODBC
pour fournir des valeurs aux colonnes BLOB.
Vous pouvez convertir une chaîne ou un nombre en hexadécimal avec la fonction HEX().
NULL
La valeur NULL signifie ``pas de données'' et est différente des valeurs
comme 0 pour les nombres ou la chaîne vide pour les types chaîne.
See section A.5.3 Problèmes avec les valeurs NULL.
NULL peut être représenté par \N lors de la récupération ou écriture
avec des fichiers (LOAD DATA INFILE, SELECT ... INTO OUTFILE).
See section 6.4.9 Syntaxe de LOAD DATA INFILE.
Les noms des bases de données, tables, index, colonnes et alias suivent tous les mêmes règles en MySQL.
Notez que les règles ont changé à partir de la version 3.23.6 de MySQL lorsqu'à été introduite la protection des noms d'identifiant avec les guillemets obliques ``'. `"' fonctionne aussi si vous fonctionnez en mode AINSI. See section 1.8.2 Exécuter MySQL en mode ANSI.
| Identifiant | Longueur maximale | Caractères autorisés |
| Base de données | 64 | Tous les caractères autorisés dans un nom de dossier à part `/', `\' et `.'. |
| Table | 64 | Tous les caractères autorisés dans le nom d'un fichier à part `/' et `.'. |
| Colonne | 64 | Tous. |
| Alias | 255 | tous. |
Notez qu'en plus de ce qui précède, vous n'avez pas droit au caractères ASCII(0), ASCII(255) ou aux guillemets dans un identifiant.
Notez que si un identifiant est un mot réservé, ou contient des caractères spéciaux, vous devez
absolument le protéger avec ` :
mysql> SELECT * FROM `select` WHERE `select`.id > 100;
See section 6.1.7 Est-ce que MySQL est sensible aux mots réservés ?.
Dans les versions antérieures à la 3.23.6, les règles étaient les suivantes :
--default-character-set de mysqld.
See section 4.6.1 Le jeu de caractères utilisé pour les données et le stockage.
Il est conseillé de ne pas utiliser de nom comme 1e, car une expression comme 1e + 1
est ambigue. Ce nom pourra être interprété comme l'expression 1e + 1 ou le nombre 1e+1.
Avec MySQL vous pouvez indiquer une colonne avec l'une des syntaxes suivantes :
| Référence | Signification |
nom_colonne | La colonne nom_colonne
de chaque table utilisée dans la requête qui comporte une telle colonne.
|
nom_de_table.nom_colonne | La colonne nom_colonne de la table
nom_de_table de la base de données courante.
|
nom_de_base.nom_de_table.nom_colonne | La colonne nom_colonne de la table
nom_de_table de la base nom_de_base. Cette forme est disponible à partir de la
version 3.22 de MySQL.
|
`nom_colonne` | Une colonne qui est un mot réservé ou qui contient un caractère spécial. |
Vous n'avez pas besoin de spécifier nom_de_table ou nom_de_base.nom_de_table
avant une colonne sauf si la référence risque d'être ambigue.
Par exemple, supposons que t1 et t2 contiennent toutes les deux une colonne
nommée c, et que vous lisez c dans une requête SELECT qui utilise
t1 et t2 à la fois. Dans ce cas, c est ambigu car il peut se référer
t1 aussi bien qu'à t2. Vous devez donc indiquer la table ciblée en écrivant
t1.c ou t2.c. De même, si vous lisez à partir d'une table t située dans
la base db1 et de la table t dans la base db2, vous devez vous référer
aux colonnes de ces tables en écrivant db1.t.nom_colonne et db2.t.nom_colonne.
La syntaxe .nom_de_table référence la table nom_de_table dans
la base de données courante. Cette syntaxe est acceptée pour assurer la compatibilité
avec ODBC, car certains pilotes ODBC préfixent les noms des tables avec des points (`.').
En MySQL, les bases et les tables correspondent à des dossiers et des fichiers. Par conséquent, la sensibilité à la casse du système détérminera la sensisbilité à la casse des noms de bases de données et tables. Cela signifie que les noms sont insensibles à la casse sous Windows, et sensibles sous la plupart des variétés Unix (Mac OS X étant une exception). See section 1.8.3 Extensions de MySQL à la norme ANSI SQL92.
Note : Même si les noms ne sont pas sensibles à la casse sous Windows, vous
ne devez pas vous référer à une entité en utilisant différentes casse dans la même requête.
La requête suivante ne fonctionnera pas car elle se référe à une table avec ma_table et MA_TABLE:
mysql> SELECT * FROM ma_table WHERE MA_TABLE.col=1;
Les noms de colonnes et d'alias sont insensibles à la casse dans tous les cas.
Les alias sur tables sont sensibles à la casse. La requête suivante ne marchera
pas car elle se réfère à a et A :
mysql> SELECT nom_de_colonne FROM nom_de_table AS a
-> WHERE a.nom_de_colonne = 1 OR A.nom_de_colonne = 2;
Si vous avez du mal à vous souvenir de la casse des noms de bases et de tables, adoptez une convention, comme toujours créer les bases et les tables en utilisant des minuscules.
Un moyen d'éviter ce problème est de démarrer mysqld avec -O
lower_case_table_names=1. Par défaut, cette option vaut 1 sur Windows et 0 sur
Unix.
Si lower_case_table_names est à 1 MySQL convertira tout les noms de tables en minuscules
lors des sauvegardes et des récupérations. (A partir de la version 4.0.2, cette opération s'applique
aussi aux noms de bases de données.).
Notez que si vous changez cette option, vous devrez repasser vos anciens noms de tables en minuscules
avant de démarrer mysqld.
Si vous déplacez les fichiers MyISAM d'un Windows à une architecture *nix,
vous aurez peut être besoin d'utiliser l'utilitaire `mysql_fix_extensions' pour
corriger la casse des extensions des fichiers dans chaque répertoire spécifique à la
base de données (minuscules `.frm', majuscules `.MYI' et `.MYD').
`mysql_fix_extensions' peut être trouvé dans le sous-répertoire `script'.
MySQL supporte les variables utilisateur spécifiques à la connexion avec
la syntaxe @variablename. Un nom de variable consiste de caractères
alpha-numériques, basés sur le jeu de caractères courant, de `_', `$', et `.'.
Le jeu de caractères par défaut est ISO-8859-1 Latin1. Cette valeur peut être changée
en utilisant l'option --default-character-set de mysqld. See section 4.6.1 Le jeu de caractères utilisé pour les données et le stockage.
Les variables n'ont pas besoin d'être initialisés. Elles sont à NULL par défaut
et peuvent contenir un entier, un réel ou une chaîne. Toutes les variables d'un thread sont
automatiquement libérées lorsque le thread se termine.
Vous pouvez déclarer une variable avec la syntaxe de SET :
SET @variable= { expression entier | expression réel | expression chaîne }
[,@variable= ...].
Vous pouvez aussi assigner une valeur à une variable avec d'autres commande que SET.
Par contre, dans ce cas là, l'opérateur d'assignation est := au lieu de =, parce que
= est réservé aux comparaisons dans les requêtes autres que SET :
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3; +----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Les variables utilisateur peuvent être utilisés là où les expressions sont allouées.
Notez que cela n'inclut pas pour l'instant les contextes où un nombre est explicitement requis,
comme ce qui est le cas avec la clause LIMIT dans une requête SELECT, ou la
clause IGNORE nombre LINES dans une requête LOAD DATA.
Note : dans une requête SELECT, chaque expression est n'évaluée
que lors de l'envoi au client. Cela signifie que pour les clauses HAVING,
GROUP BY, ou ORDER BY, vous ne pouvez vous référer à une expression
qui implique des variables qui sont définies dans la partie SELECT. Par exemple,
la requête suivante ne produira pas le résultat escompté :
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nom_de_table HAVING b=5;
La raison est que @aa ne contiendra pas la valeur de la ligne courante, mais
celle de id pour la dernière ligne acceptée.
A partir de la version 4.0.3 de MySQL, nous fournissons un meilleur accès à beaucoup de variables système et variables de connexion. On peut changer la plupart d'entre elle sans avoir à stopper le serveur.
Il y a deux sortes de variables système : Les variables spécifiques aux threads (ou à la connexion) qui sont uniques à la connexion courante et les variables globales qui sont utilisées pour configurer les évènements globaux. Les variables globales sont aussi utilisées pour configurer les valeurs initales des variables spécifiques au threads pour les nouvelles connexions.
Lorsque mysqld démarre, toutes les variables globales sont initialisées à partir
des arguements passés en ligne de commande et des fichiers de configuration.
Vous pouvez changer ces valeurs avec la commande SET GLOBAL.
Lorsqu'un nouveau thread est créé, les variables spécifiques aux threads sont initialisées
à partir des variables globales et ne changeront pas même si vous utilisez la commande
SET GLOBAL.
Pour définir la valeur d'une variable GLOBAL, vous devez utiliser l'une des syntaxes
suivantes :
(Ici nous utilisons la variable sort_buffer_size à titre d'exemple)
SET GLOBAL sort_buffer_size=valeur; SET @@global.sort_buffer_size=valeur;
Pour définir la valeur d'une variable SESSION, vous devez utiliser l'une des syntaxes
suivantes :
SET SESSION sort_buffer_size=valeur; SET @@session.sort_buffer_size=valeur; SET sort_buffer_size=valeur;
Si vous ne spécifiez pas GLOBAL ou SESSION alors SESSION
est utilisé. See section 5.5.6 Syntaxe de SET.
LOCAL est un synonyme de SESSION.
Pour récupérer la valeur d'une variable de type GLOBAL vous pouvez utiliser l'une
des commandes suivantes :
SELECT @@global.sort_buffer_size; SHOW GLOBAL VARIABLES like 'sort_buffer_size';
Pour récupérer la valeur d'une variable de type SESSION vous pouvez utiliser l'une
des commandes suivantes :
SELECT @@session.sort_buffer_size; SHOW SESSION VARIABLES like 'sort_buffer_size';
Lorsque vous récuperez une valeur de variable avec la syntaxe
@@nom_variable et que vous ne spécifiez pas GLOBAL ou
SESSION, MySQL retournera la valeur spécifique au thread (SESSION)
si elle existe. Sinon, MySQL retournera la valeur globale.
La raison d'imposer la présence du mot GLOBAL pour configurer une variable de type
GLOBAL mais non pour la lire est pour être sur que vous n'aurez pas de problèmes plus
tard si vous voulez introduire ou effacer une variable spécifique au thread qui aurait le même
nom. Dans ce cas, vous pourriez changer accidentellement l'état du serveur pour toutes les connexions
(et non la votre uniquement).
Voilà la liste complète de toutes les variables que que vous pouvez récuperer ou modifier
et une indication quant à l'utilisation de GLOBAL ou SESSION avec elles.
| Nom de la variable | Type de valeur | Type |
| autocommit | bool | SESSION |
| big_tables | bool | SESSION |
| binlog_cache_size | num | GLOBAL |
| bulk_insert_buffer_size | num | GLOBAL | SESSION |
| concurrent_insert | bool | GLOBAL |
| connect_timeout | num | GLOBAL |
| convert_character_set | string | SESSION |
| delay_key_write | OFF | ON | ALL | GLOBAL |
| delayed_insert_limit | num | GLOBAL |
| delayed_insert_timeout | num | GLOBAL |
| delayed_queue_size | num | GLOBAL |
| error_count | num | LOCAL |
| flush | bool | GLOBAL |
| flush_time | num | GLOBAL |
| foreign_key_checks | bool | SESSION |
| identity | num | SESSION |
| insert_id | bool | SESSION |
| interactive_timeout | num | GLOBAL | SESSION |
| join_buffer_size | num | GLOBAL | SESSION |
| key_buffer_size | num | GLOBAL |
| last_insert_id | bool | SESSION |
| local_infile | bool | GLOBAL |
| log_warnings | bool | GLOBAL |
| long_query_time | num | GLOBAL | SESSION |
| low_priority_updates | bool | GLOBAL | SESSION |
| max_allowed_packet | num | GLOBAL | SESSION |
| max_binlog_cache_size | num | GLOBAL |
| max_binlog_size | num | GLOBAL |
| max_connect_errors | num | GLOBAL |
| max_connections | num | GLOBAL |
| max_error_count | num | GLOBAL | SESSION |
| max_delayed_threads | num | GLOBAL |
| max_heap_table_size | num | GLOBAL | SESSION |
| max_join_size | num | GLOBAL | SESSION |
| max_sort_length | num | GLOBAL | SESSION |
| max_tmp_tables | num | GLOBAL |
| max_user_connections | num | GLOBAL |
| max_write_lock_count | num | GLOBAL |
| myisam_max_extra_sort_file_size | num | GLOBAL | SESSION |
| myisam_max_sort_file_size | num | GLOBAL | SESSION |
| myisam_sort_buffer_size | num | GLOBAL | SESSION |
| net_buffer_length | num | GLOBAL | SESSION |
| net_read_timeout | num | GLOBAL | SESSION |
| net_retry_count | num | GLOBAL | SESSION |
| net_write_timeout | num | GLOBAL | SESSION |
| query_cache_limit | num | GLOBAL |
| query_cache_size | num | GLOBAL |
| query_cache_type | enum | GLOBAL |
| read_buffer_size | num | GLOBAL | SESSION |
| read_rnd_buffer_size | num | GLOBAL | SESSION |
| rpl_recovery_rank | num | GLOBAL |
| safe_show_database | bool | GLOBAL |
| server_id | num | GLOBAL |
| slave_compressed_protocol | bool | GLOBAL |
| slave_net_timeout | num | GLOBAL |
| slow_launch_time | num | GLOBAL |
| sort_buffer_size | num | GLOBAL | SESSION |
| sql_auto_is_null | bool | SESSION |
| sql_big_selects | bool | SESSION |
| sql_big_tables | bool | SESSION |
| sql_buffer_result | bool | SESSION |
| sql_log_binlog | bool | SESSION |
| sql_log_off | bool | SESSION |
| sql_log_update | bool | SESSION |
| sql_low_priority_updates | bool | GLOBAL | SESSION |
| sql_max_join_size | num | GLOBAL | SESSION |
| sql_quote_show_create | bool | SESSION |
| sql_safe_updates | bool | SESSION |
| sql_select_limit | bool | SESSION |
| sql_slave_skip_counter | num | GLOBAL |
| sql_warnings | bool | SESSION |
| table_cache | num | GLOBAL |
| table_type | enum | GLOBAL | SESSION |
| thread_cache_size | num | GLOBAL |
| timestamp | bool | SESSION |
| tmp_table_size | enum | GLOBAL | SESSION |
| tx_isolation | enum | GLOBAL | SESSION |
| version | string | GLOBAL |
| wait_timeout | num | GLOBAL | SESSION |
| warning_count | num | LOCAL |
| unique_checks | bool | SESSION |
Les variables suivies d'un num peuvent se voir affecter une valeur
numérique. Celles marquées avec bool peuvent prendre 0, 1, ON
ou OFF.
Les variables qui sont du type enum doivent normalement comporter au moins
l'une des valeurs disponibles pour la variable, mais peuvent aussi contenir les index
des membres de la collection. (Le premier index est 0).
Voilà une description de quelques variables :
| Variable | Description |
| identity | Alias pour last_insert_id (compatibilité Sybase) |
| sql_low_priority_updates | Alias pour low_priority_updates |
| sql_max_join_size | Alias pour max_join_size |
| delay_key_write_for_all_tables | Si cette variable et delay_key_write sont définies, alors toutes les nouvelles tables MyISAM qui sont ouvertes utiliseront les écritures de clefs reportées. |
| version | Alias for VERSION() (compatibilité Sybase (?)) |
Une déscription des autres variables peut être trouvée dans la section
des options de démarrage, la description de SHOW VARIABLES et dans
la section de SET. See section 4.1.1 Options de ligne de commande de mysqld. See section 4.5.6.4 Syntaxe de SHOW VARIABLES. See section 5.5.6 Syntaxe de SET.
Le serveur MySQL supporte les commentaires de la forme # jusqu'à la fin de la ligne, --
jusqu'à la fin de la ligne et /* dans la ligne ou sur plusieurs lignes */ :
mysql> SELECT 1+1; # Ce commentaire se continue jusqu'à la fin de la ligne mysql> SELECT 1+1; -- Ce commentaire se continue jusqu'à la fin de la ligne mysql> SELECT 1 /* Ceci est un commentaire dans la ligne */ + 1; mysql> SELECT 1+ /* Ceci est un commentaire sur plusieurs lignes */ 1;
Notez que le style de commentaire -- requiert au moins un espace après le second tiret !
Même si le serveur interprète correctement les syntaxes de commentaires décrites plus haut, il y a quelques limitations dans la façon où le client interprète les commentaires multi-lignes :
mysql> en '> ou ">.
Ces limitations s'appliquent aussi bien à mysql en ligne de commande,
que lorsque vous demandez à mysql de lire des commandes depuis un fichier
(mysql < un-fichier).
MySQL ne supporte les commentaires du style `--' ANSI SQL que si le second tiret est suivi d'un espace. See section 1.8.4.7 `--' comme début de commentaire.
Un problème récurrent provient de la tentative de création de tables avec des
noms de colonnes qui sont des types de champs ou des fonctions natives de MySQL,
comme TIMESTAMP ou GROUP. Il vous st permis de le faire (par exemple
ABS est permis comme nom de colonne), mais les espaces ne sont pas permis
entre le nom d'une fonction et la première `(' suivante lors de l'utilisation
de fonctions qui sont aussi des noms de colonnes.
Les mots suivants sont explicitement réservés en MySQL. La plupart sont interdits
par ANSI SQL92 en tant que nom de colonnes ou de tables (par exemple, GROUP).
Quelques uns sont réservés parce que MySQL en a besoin et utilise (actuellement) un
analyseur yacc :
| Word | Word | Word |
ADD
| ALL
| ALTER
|
ANALYZE
| AND
| AS
|
ASC
| ASENSITIVE
| AUTO_INCREMENT
|
BDB
| BEFORE
| BERKELEYDB
|
BETWEEN
| BIGINT
| BINARY
|
BLOB
| BOTH
| BY
|
CALL
| CASCADE
| CASE
|
CHANGE
| CHAR
| CHARACTER
|
CHECK
| COLLATE
| COLUMN
|
COLUMNS
| CONDITION
| CONNECTION
|
CONSTRAINT
| CONTINUE
| CREATE
|
CROSS
| CURRENT_DATE
| CURRENT_TIME
|
CURRENT_TIMESTAMP
| CURSOR
| DATABASE
|
DATABASES
| DAY_HOUR
| DAY_MICROSECOND
|
DAY_MINUTE
| DAY_SECOND
| DEC
|
DECIMAL
| DECLARE
| DEFAULT
|
DELAYED
| DELETE
| DESC
|
DESCRIBE
| DETERMINISTIC
| DISTINCT
|
DISTINCTROW
| DIV
| DOUBLE
|
DROP
| ELSE
| ELSEIF
|
ENCLOSED
| ESCAPED
| EXISTS
|
EXIT
| EXPLAIN
| FALSE
|
FETCH
| FIELDS
| FLOAT
|
FOR
| FORCE
| FOREIGN
|
FOUND
| FRAC_SECOND
| FROM
|
FULLTEXT
| GRANT
| GROUP
|
HAVING
| HIGH_PRIORITY
| HOUR_MICROSECOND
|
HOUR_MINUTE
| HOUR_SECOND
| IF
|
IGNORE
| IN
| INDEX
|
INFILE
| INNER
| INNODB
|
INOUT
| INSENSITIVE
| INSERT
|
INT
| INTEGER
| INTERVAL
|
INTO
| IO_THREAD
| IS
|
ITERATE
| JOIN
| KEY
|
KEYS
| KILL
| LEADING
|
LEAVE
| LEFT
| LIKE
|
LIMIT
| LINES
| LOAD
|
LOCALTIME
| LOCALTIMESTAMP
| LOCK
|
LONG
| LONGBLOB
| LONGTEXT
|
LOOP
| LOW_PRIORITY
| MASTER_SERVER_ID
|
MATCH
| MEDIUMBLOB
| MEDIUMINT
|
MEDIUMTEXT
| MIDDLEINT
| MINUTE_MICROSECOND
|
MINUTE_SECOND
| MOD
| NATURAL
|
NOT
| NO_WRITE_TO_BINLOG
| NULL
|
NUMERIC
| ON
| OPTIMIZE
|
OPTION
| OPTIONALLY
| OR
|
ORDER
| OUT
| OUTER
|
OUTFILE
| PRECISION
| PRIMARY
|
PRIVILEGES
| PROCEDURE
| PURGE
|
READ
| REAL
| REFERENCES
|
REGEXP
| RENAME
| REPEAT
|
REPLACE
| REQUIRE
| RESTRICT
|
RETURN
| REVOKE
| RIGHT
|
RLIKE
| SECOND_MICROSECOND
| SELECT
|
SENSITIVE
| SEPARATOR
| SET
|
SHOW
| SMALLINT
| SOME
|
SONAME
| SPATIAL
| SPECIFIC
|
SQL
| SQLEXCEPTION
| SQLSTATE
|
SQLWARNING
| SQL_BIG_RESULT
| SQL_CALC_FOUND_ROWS
|
SQL_SMALL_RESULT
| SQL_TSI_DAY
| SQL_TSI_FRAC_SECOND
|
SQL_TSI_HOUR
| SQL_TSI_MINUTE
| SQL_TSI_MONTH
|
SQL_TSI_QUARTER
| SQL_TSI_SECOND
| SQL_TSI_WEEK
|
SQL_TSI_YEAR
| SSL
| STARTING
|
STRAIGHT_JOIN
| STRIPED
| TABLE
|
TABLES
| TERMINATED
| THEN
|
TIMESTAMPADD
| TIMESTAMPDIFF
| TINYBLOB
|
TINYINT
| TINYTEXT
| TO
|
TRAILING
| TRUE
| UNDO
|
UNION
| UNIQUE
| UNLOCK
|
UNSIGNED
| UPDATE
| USAGE
|
USE
| USER_RESOURCES
| USING
|
UTC_DATE
| UTC_TIME
| UTC_TIMESTAMP
|
VALUES
| VARBINARY
| VARCHAR
|
VARCHARACTER
| VARYING
| WHEN
|
WHERE
| WHILE
| WITH
|
WRITE
| XOR
| YEAR_MONTH
|
ZEROFILL
|
Les symboles suivants (issus de la table ci-dessus) sont interdits par ANSI SQL mais permis par MySQL en tant que noms de colonnes ou de tables. Cela est du au fait que ces noms sont très courants, et de nombreux programmeur les ont déjà utilisés.
ACTION
BIT
DATE
ENUM
NO
TEXT
TIME
TIMESTAMP
MySQL supporte un grand nombre de types de colonnes, qui peuvent être rassemblés en trois groupes : les nombres, les dates et les chaînes de caractères. Cette section présente les types disponibles et leurs tailles de stockage, puis présente en détail chaque type. L'introduction est volontairement brève. Une section plus précise est dédiée à chaque type, qui présente tous les formats valides.
Les types de colonnes de MySQL sont listés ci-dessous. Les codes suivants sont utilisés dans les descriptions :
M
D
M-2.
Les crochets (`[' et `]') indiquent les spécifications optionnelles.
Notez que si vous spécifiez ZEROFILL pour une colonne, MySQL ajoutera automatiquement l'attribut UNSIGNED à la colonne.
Attention : vous devez garder à l'esprit que lors de la soustraction de deux entiers
dont l'un est de type UNSIGNED, le résultat ne sera pas signé ! See section 6.3.5 Fonctions de transtypage.
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
-128 et 127, sinon
elle varie de 0 à 255.
BIT
BOOL
TINYINT(1).
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
-32768 et 32767, sinon
elle varie de 0 à 65535.
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
-8388608 et
8388607, sinon elle varie entre 0 et 16777215.
INT[(M)] [UNSIGNED] [ZEROFILL]
-2147483648 et
2147483647, sinon elle varie entre 0 et 4294967295.
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
INT.
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
-9223372036854775808 et
9223372036854775807, sinon elle varie entre 0 et 18446744073709551615.
Quelques choses à savoir pour bien utiliser les colonnes de type BIGINT :
BIGINT signés ou des valeurs de type
DOUBLE, vous ne devez donc pas utiliser de grands entiers non-signés plus grand que
9223372036854775807 (63 bits) excepté avec les fonctions sur les bits ! Si vous le faites,
certains des derniers chiffres du résultat risquent d'être faux à cause des erreurs d'arrondissage
lors de la conversion de BIGINT à DOUBLE.
MySQL 4.0 peut gérer les BIGINT dans les cas suivants :
BIGINT.
MIN(colonne_big_int) and MAX(colonne_big_int).
+, -, *, etc.) lorsque les deux
opérandes sont des entiers.
BIGINT en l'enregistrant en tant que chaîne. Dans ce cas, MySQL éffectuera
une conversion chaîne à nombre qui ne fait entrer en jeu aucune représentation intermédiaire
en réel.
BIGINT quand les deux
arguments sont des valeurs entières ! Cela signifie que si vous multipliez deux grands
entiers (ou des résultats de fonctions qui retournent des entiers) vous obtiendrez peut être
des résultats inattendus quand le résultat est supérieur à 9223372036854775807.
FLOAT(précision) [UNSIGNED] [ZEROFILL]
précision<=24 pour un nombre à virgule flottante de
précision simple, entre 25 et 53 pour une précision double. Ces types correspondent aux types
FLOAT et DOUBLE décrits ci-dessus.
FLOAT(X) a le même intervalle de validité que FLOAT et DOUBLE, mais la taille d'affichage
et le nombre de décimale sont indéfinies.
Dans la version 3.23 de MySQL, c'est un véritable nombre à virgule flottante.
Dans les anciennes versions de MySQL, FLOAT(précision) avait toujours deux décimales.
Notez que l'utilisation du type FLOAT peut vous créér des problèmes inattendus
car tous les calculs internes de MySQL sont fait en double précision.
See section A.5.6 Résoudre les problèmes des lignes non retournées.
Cette syntaxe est fournie pour assurer la compatibilité avec ODBC.
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
-3.402823466E+38 à
-1.175494351E-38, 0
et de 1.175494351E-38 à 3.402823466E+38.
Si UNSIGNED est spécifié, les valeurs négatives sont interdites.
M représente la taille d'affichage et D est le nombre de décimales.
FLOAT sans arguments, ou avec un argument <= 24 représente un nombre
à virgule flottante de précision simple.
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
-1.7976931348623157E+308 à
-2.2250738585072014E-308, 0
et de 2.2250738585072014E-308 à 1.7976931348623157E+308.
Si UNSIGNED est spécifié, les valeurs négatives sont interdites.
M représente la taille d'affichage et D est le nombre de décimales.
FLOAT sans arguments, ou avec un argument compris entre 25 et 53 (inclus)
représente un nombre à virgule flottante de précision double.
DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL]
REAL[(M,D)] [UNSIGNED] [ZEROFILL]
DOUBLE.
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
CHAR : la valeur est stockée comme une chaîne,
chaque caractère représentant un chiffre de la valeur. La virgule et le signe `-' des nombres
négatifs ne sont pas comptés dans l'option M (mais de l'espace de stockage est reservé pour eux).
Si D vaut 0, les valeurs n'auront pas de valeur décimale. L'intervalle de validité des valeurs
DECIMAL est le même que DOUBLE, mais il peut être limité par les valeurs choisies pour
M et D. Si UNSIGNED est spécifié, les valeurs négatives sont interdites.
Si D est ommis, la valeur par défaut est 0. Si M est ommis, la
valeur par défaut est 10.
Avant la version 3.23 de MySQL, l'argument M doit inclure l'espace requis
pour le signe et le point des décimales.
DEC[(M[,D])] [UNSIGNED] [ZEROFILL]
NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL]
DECIMAL.
DATE
'1000-01-01' à '9999-12-31'.
MySQL affiche les valeurs DATE au format 'AAAA-MM-JJ' (année-mois-jour),
mais vous pouvez assigner des valeurs aux colonnes DATE en utilisant différents
formats numériques ou de chaînes de caractères. See section 6.2.2.2 Les types DATETIME, DATE, et TIMESTAMP.
DATETIME
'1000-01-01 00:00:00'
à '9999-12-31 23:59:59'.
MySQL affiche les valeurs DATETIME au format 'AAAA-MM-JJ HH:MM:SS'
(année-mois-jour heure:minutes:secondes), mais vous pouvez assigner des valeurs aux
colonnes DATETIME en utilisant différents formats numériques ou de chaînes de caractères.
See section 6.2.2.2 Les types DATETIME, DATE, et TIMESTAMP.
TIMESTAMP[(M)]
'1970-01-01 00:00:00' à
quelque part durant l'année 2037. MySQL affiche les valeurs de type TIMESTAMP
au format AAAAMMJJHHMMSS, AAMMJJHHMMSS, AAAAMMJJ, ou AAMMJJ,
suivant que le paramètre M vaut 14 (ou omis), 12, 8, ou 6,
mais vous pouvez assigner des valeurs aux colonnes TIMESTAMP sous forme de nombre
ou de chaînes.
Une colonne de type TIMESTAMP est pratique pour enregistrer une date, lors d'une commande
INSERT ou UPDATE, car elle est automatiquement mise à la date et l'heure du moment
de la commande, si vous ne fournissez pas de valeur vous-même.
Vous pouvez aussi lui donner la date et l'heure courante en lui assignant la valeur NULL.
See section 6.2.2 Les types date et heure.
Un TIMESTAMP est toujours stocké sur 4 octets. L'argument M n'affecte que le mode
d'affichage de ce type de colonne.
Notez bien que les colonnes de type TIMESTAMP(X) où X vaut 8 ou 14 sont
considérées comme des nombres tandis que les autres colonnes TIMESTAMP(X) sont considérées
comme des chaînes.
Ceci est fait pour s'assurer que l'on peut exporter et importer les tables avec ces types.
See section 6.2.2.2 Les types DATETIME, DATE, et TIMESTAMP.
TIME
'-838:59:59' à '838:59:59'. MySQL affiche les
colonnes de type TIME au format 'HH:MM:SS', mais vous pouvez assigner une valeur de type
TIME en lui passant des chaînes ou des entiers.
See section 6.2.2.3 Le type TIME.
YEAR[(2|4)]
1901
à 2155, 0000 pour le format à 4 chiffres, et de 1970 à 2069 pour le format à deux
chiffres. MySQL affiche les valeurs de type YEAR au format AAAA, mais vous pouvez leur assigner
des chaînes ou des nombres. (le type YEAR est nouveau depuis la version 3.22 de MySQL)
See section 6.2.2.4 Le type YEAR.
[NATIONAL] CHAR(M) [BINARY]
M peut valoir de 0 à 255 caractères.
(1 à 255 dans les versions antérieures à la 3.23)
Les espaces terminaux sont supprimés lorsque la chaîne est lue dans la base.
Les valeurs de type CHAR sont triées et comparées sans tenir compte de la casse
et en utilisant le jeu de caractères par défaut. Toutefois, vous pouvez utiliser
l'opérateur BINARY pour effectuer des recherches sensibles à la casse.
NATIONAL CHAR (forme courte : NCHAR) est la dénomination ANSI SQL pour les colonnes
de type CHAR qui doivent utiliser le jeu de caractères par défaut.
C'est la configuration par défaut de MySQL.
MySQL autorise la création de colonne de type CHAR(0). Cela ne sert réellement que si
vous devez être compatible avec une vieille application, dont le bon fonctionnement
repose sur l'existence de la colonne, mais qui n'utilise pas vraiment ses valeurs.
C'est aussi pratique lorsque vous devez stocker un booléen (ou une valeur à deux états)
dans une colonne : une colonne de type CHAR(0), qui n'a pas l'attribut NOT NULL, n'occupera
qu'un seul octet, et peut prendre deux valeurs : NULL et "". See section 6.2.3.1 Les types CHAR et VARCHAR.
CHAR est une forme courte de CHARACTER.
CHAR
CHAR(1).
[NATIONAL] VARCHAR(M) [BINARY]
VARCHAR sont
triées et comparées sans tenir compte de la casse et en utilisant le jeu de caractères par défaut.
Toutefois, vous pouvez utiliser l'opérateur BINARY pour effectuer des recherches sensibles à la casse.
See section 6.5.3.1 Modification automatique du type de colonnes.
VARCHAR est un forme courte de CHARACTER VARYING.
See section 6.2.3.1 Les types CHAR et VARCHAR.
TINYBLOB
TINYTEXT
BLOB ou TEXT avec une longueur maximale de 255 (2^8 - 1)
caractères. See section 6.5.3.1 Modification automatique du type de colonnes. See section 6.2.3.2 Les types BLOB et TEXT.
BLOB
TEXT
BLOB ou TEXT avec une longueur maximale de 65535 (2^16 - 1)
caractères. See section 6.5.3.1 Modification automatique du type de colonnes. See section 6.2.3.2 Les types BLOB et TEXT.
MEDIUMBLOB
MEDIUMTEXT
BLOB ou TEXT avec une longueur maximale de 16777215
(2^24 - 1) caractères. See section 6.5.3.1 Modification automatique du type de colonnes. See section 6.2.3.2 Les types BLOB et TEXT.
LONGBLOB
LONGTEXT
BLOB ou TEXT avec une longueur maximale de 4294967295
(2^32 - 1) caractères. See section 6.5.3.1 Modification automatique du type de colonnes. Notez que puisque le protocole
serveur/client et les tables de type MyISAM ont une limitation de 16M par paquet
communiqué / ligne, vous ne pourrez utiliser la totalité de la longueur de ce type.
See section 6.2.3.2 Les types BLOB et TEXT.
ENUM('valeur1','valeur2',...)
'valeur1', 'valeur2', ..., NULL
ou la valeur spéciale d'erreur "".
Un ENUM peut avoir un maximum de 65535 valeurs distinctes. See section 6.2.3.3 Le type ENUM.
SET('valeur1','valeur2',...)
'valeur1', 'valeur2', ...
Un SET peut avoir au maximum 60 éléments. See section 6.2.3.4 Le type SET.
MySQL supporte tous les types numériques de la norme ANSI/ISO SQL92.
Ceux ci représentent les types numériques exacts (NUMERIC,
DECIMAL, INTEGER, et SMALLINT), ainsi que les types
approchés (FLOAT, REAL, et DOUBLE PRECISION).
Le mot clef INT est un synonyme de INTEGER, et le mot clef
DEC est un synonyme de DECIMAL.
Les types NUMERIC et DECIMAL sont considérés comme identiques par
MySQL, comme l'autorise le standard SQL92.
Ils sont utilisées par des valeurs dont il est primordial de conserver la précision
exacte, comme pour des données financières.
Lorsque vous déclarez des colonnes avec l'un de ces types, vous pouvez indiquer la
précision et l'échelle comme ceci :
salaire DECIMAL(5,2)
Dans cet exemple, 5 (précision) représente le nombre de décimales
signifiantes qui seront stockées pour les valeurs, et 2 (échelle)
représente le nombre de chiffres qui seront stockés après le point des décimales.
Dans ce cas, toutefois, l'intervalle des valeurs pouvant être stockés dans la colonne
salaire varie de -99.99 à 99.99.
(MySQL peut actuellement stocker des nombres allant jusqu'à 999.99 dans cette
colonne car il n'a pas besoin de l'espace qui sert à stocker le signe pour un nombre
positif)
En ANSI/ISO SQL92, la syntaxe DECIMAL(p) est équivalente à DECIMAL(p,0).
De manière similaire, la syntaxe DECIMAL est équivalente à to DECIMAL(p,0),
où l'implémentation est autorisée à choisir la valeur de p.
MySQL ne supporte pas actuellement ces formes variantes des types de données
DECIMAL/NUMERIC. Cela ne pose pas généralement de grand problèmes, vu que
le principal bénéfice de ces types est de pouvoir contrôler explicitement la précision
et l'échelle.
Les valeurs de type DECIMAL et NUMERIC sont stockées sous forme de chaînes
de caractères, plutôt que comme des nombres à virgule flottante, afin de préserver la
précision décimale des valeurs. Un caractère est donc nécessaire pour chaque chiffre, plus
la virgule (si scale > 0), et le signe moins `-' (pour les nombres négatifs).
Si scale vaut 0, les valeurs de type DECIMAL et NUMERIC ne comporteront
pas de valeur décimale, ni de virgule.
L'intervalle de validité maximale des valeurs de type DECIMAL et NUMERIC est
le même que pour le type DOUBLE, mais l'intervalle réel peut être limité par le choix
des paramètres précision et scale.
Lorsqu'une valeur ayant trop de décimales est affectée à une colonne, la valeur est arrondie
à scale décimales.
Lorsqu'une valeur est hors des limites de validité de la colonne DECIMAL ou NUMERIC,
MySQL enregistre la plus grande valeur qu'il peut à la place.
En extension de la norme ANSI/ISO SQL92, MySQL supporte aussi les types entiers TINYINT,
MEDIUMINT, et BIGINT, comme présenté ci-dessus.
Un autre extension supportée par MySQL permet de spécifier optionnellement la taille d'affichage,
sous la forme d'une valeur entière entre parenthèses, juste après le mot clé spécifiant le type
(par exemple, INT(4)). Cette spécification de taille est utilisée pour remplir à gauche, avec le
caractère de remplissage par défaut, les nombres dont la taille est inférieure à celle spécifiée
mais uniquement à l'affichage : cela ne réduit pas l'intervalle de validité des valeurs qui peuvent
être stockées dans la colonne.
Lorsqu'elle est utilisée avec l'attribut de colonne optionnel ZEROFILL, le caractère de
remplissage par défaut est remplacé par le caractère zéro.
Par exemple, pour une colonne dont le type est INT(5) ZEROFILL, la valeur 4 sera
lue 00004.
Notez que si vous stockez des nombres plus grands que la taille maximale d'affichage, vous pouvez rencontrer des problèmes lors de jointures de tables particulièrement compliquées, surtout si MySQL génére des tables temporaires : dans ce cas, MySQL pense que les données étaient limitées par l'affichage.
Tous les types entiers ont un attribut optionnel (non-standard) UNSIGNED (non-signé, en
français). Les valeurs non-signées peuvent être utilisées pour n'autoriser que des valeurs positives
dans une colonne, ou bien pour exploiter un intervalle de validité plus haut.
Depuis la version 4.0.2 de MySQL, les nombres à virgule flottante peuvent aussi être UNSIGNED
Comme avec les types entiers, cet attribut interdit les valeurs négatives dans la colonne, mais n'élève
pas l'intervalle de validité.
Le type FLOAT est utilisé pour représenter des données numériques approchées.
La norme ANSI/ISO SQL92 permet la spécification optionnelle de la précision (mais pas de l'intervalle
de validité) en fournissant le nombre de décimales voulues après la spécification de type, et entre
parenthèses.
L'implémentation de MySQL supporte aussi le paramétrage de la précision. Si le mot clé FLOAT est
utilisé pour une colonne sans précision supplémentaire, MySQL utilise quatre octets pour stocker les
valeurs. Une syntaxe alternative existe aussi, elle utilise deux paramètre optionnel après le mot clé
FLOAT. Avec cette option, le premier nombre représente toujours la taille de stockage nécessaire
pour la valeur, et le second nombre représente le nombre de chiffres à stocker et afficher, après la
virgule décimale (comme pour les types DECIMAL et NUMERIC).
Lorsque MySQL stocke un nombre pour une telle colonne, et que cette valeur a plus de décimale que requis,
la valeur est arrondie pour éliminer les chiffres surnuméraires.
Les types REAL et DOUBLE PRECISION n'acceptent pas de paramétrage de la précision.
En extension du standard ANSI/ISO SQL92, MySQL reconnaît DOUBLE comme un synonyme du type
DOUBLE PRECISION.
Contrairement à la norme qui requiert que REAL soit plus petit que DOUBLE PRECISION,
MySQL implémente ces deux types comme des nombres à virgule flottante de 8 octets, en double précision
(lorsque le mode ``ANSI'' n'est pas activé).
Pour une portabilité maximale, les applications réclamant le stockage de nombres approché doivent
utiliser les types FLOAT ou DOUBLE PRECISION sans spécification de précision ou de nombre
de décimales.
Lorsque MySQL doit stocker une valeur qui est hors de l'intervalle de validité d'une colonne, il ramène
la valeur à la plus proche possible, et stocke cette valeur.
Par exemple, l'intervalle de validité d'une colonne d'entiers INT va de -2147483648 à 2147483647.
Si vous essayez d'insérer -9999999999 dans une colonne de ce type, la valeur sera ramenée à la plus proche
possible, c'est à dire -2147483648. De même, si vous essayez d'insérer 9999999999, 2147483647 sera
stocké à la place.
Si la colonne INT possède l'attribut UNSIGNED, l'intervalle de validité est aussi large,
mais les valeurs extrêmes se décalent vers 0 et 4294967295. Si vous essayez de stocker
-9999999999 et 9999999999 dans cette colonne, vous obtiendrez respectivement 0 et 4294967296.
Les dépassements de capacité entraînant des tronquage sont affichés comme des
alertes (``warnings'') lors de l'utilisation des commandes ALTER TABLE,
LOAD DATA INFILE, UPDATE, et les insertions INSERT multiples.
| Type | Octets | De | A |
TINYINT | 1 | -128 | 127 |
SMALLINT | 2 | -32768 | 32767 |
MEDIUMINT | 3 | -8388608 | 8388607 |
INT | 4 | -2147483648 | 2147483647 |
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
Les types dates et heures sont DATETIME, DATE,
TIMESTAMP, TIME, et YEAR. Chacun d'eux à une échelle
de valeurs légales, de même que la valeur ``zéro'' quand vous spécifiez
une valeur illégale. A noter que MySQL vous permet d'enregistrer certaines dates
qui ne sont pas strictement légales, par exemple 1999-11-31.
La raison est que nous pensons que la vérification des dates est à faire
niveau application. Pour accélérer les tests, MySQL vérifie juste que le mois
est entre 0 et 12 et que le jour est entre 0 et 31. Les intervalles précédentes
sont définies de cette façon car MySQL vous permet d'enregistrer dans une colonne
DATE ou DATETIME, des dates où le jour de la semaine ou le jour du mois
est zéro. C'est extrêmement utile pour les applications où vous avez besoin d'enregistrer
une date d'anniversaire pour laquelle vous n'avez pas la date exacte. Dans ce cas, vous
enregistrez simplement la date comme 1999-00-00 ou 1999-01-00. (Vous ne devez pas
vous attendre à obtenir de valeurs correctes de fonctions tel que DATE_SUB() ou DATE_ADD
pour des dates comme cela.)
Voici quelques considérations à garder à l'esprit quand vous manipulerez ce type de champs :
98-09-04), au lieu de mois-jour-année ou jour-mois-année qui sont
très utilisés ailleurs (comme 09-04-98 ou '04-09-98').
TIME
sont coupées à la limite appropriée des valeurs de TIME.) Le tableau suivant
présente le format de la valeur ``zéro'' de chaque type :
| Column type | valeur du ``zéro'' |
DATETIME | '0000-00-00 00:00:00'
|
DATE | '0000-00-00'
|
TIMESTAMP | 00000000000000 (la longueur dépend de la taille de l'affichage)
|
TIME | '00:00:00'
|
YEAR | 0000
|
'0' ou 0
qui est plus facile à manipuler.
MyODBC est automatiquement
convertie en NULL à partir de la version 2.50.12 de MyODBC,
car ODBC ne peut manipuler de telles valeurs.
MySQL lui même est compatible an 2000. (see section 1.2.5 Compatibilité an 2000), mais les valeurs manipulées par MySQL peuvent ne pas l'être. N'importe quelle valeur n'ayant que deux chiffres pour représenter l'année est ambigu, car le siècle n'est pas précisé. Ces valeurs doivent être interprétées comme des valeurs à 4 chiffres, car MySQL stocke les années en interne en utilisant 4 chiffres.
Pour les types DATETIME, DATE, TIMESTAMP, et YEAR,
MySQL interprète les dates ambigus en se basant sur les règles suivantes :
00-69 sont converties en 2000-2069.
70-99 sont converties en 1970-1999.
Gardez bien à l'esprit que ces règles ne sont que la meilleure approximation possible d'une valeur. Si l'heuristique proposée par MySQL ne fournit pas les valeurs attendues, vous devrez fournir une valeur sans ambiguïté. (à 4 chiffres)
ORDER BY ordonnera correctement les types YEAR/DATE/DATETIME à deux chiffres.
Notez aussi que quelques fonctions comme MIN() et MAX() convertiront
un TIMESTAMP/DATE en nombre. Cela signifie qu'un timestamp avec une année à
deux chiffres ne donneront pas de résultats corrects avec ces fonctions. Une solution
dans ce cas est de convertir le TIMESTAMP/DATE en une année à 4 chiffres ou d'utiliser
quelque chose comme MIN(DATE_ADD(timestamp,INTERVAL 0 DAYS)).
DATETIME, DATE, et TIMESTAMP
Les types DATETIME, DATE, et TIMESTAMP sont liés. Cette
section décrit leurs caractéristiques, leur similarités et leurs différences.
Le type DATETIME est prévu lorsque vous souhaitez stocker une date et
une heure. MySQL affiche les valeurs de type DATETIME au format
'AAAA-MM-JJ HH:MM:SS'. L'intervalle de validité va de '1000-01-01 00:00:00'
à '9999-12-31 23:59:59'. (``validité'' signifie que même si d'autres valeurs
plus anciennes peuvent être manipulées, il n'est pas garantit qu'elles le seront).
Le type DATE est prévu lorsque vous souhaitez stocker une date.
MySQL affiche les valeurs de type DATE au format 'AAAA-MM-JJ'.
L'intervalle de validité va de '1000-01-01' à '9999-12-31'.
Le type TIMESTAMP est prévu pour stocker automatiquement l'heure courante
lors d'une commande INSERT ou UPDATE. Si vous avez plusieurs
colonnes de type TIMESTAMP, seule la première colonne sera mise à jour
automatiquement.
La modification automatique de la première colonne de type TIMESTAMP
survient si l'une des conditions suivantes est remplie :
INSERT ou
LOAD DATA INFILE.
UPDATE et
d'autres colonnes changent de valeurs (Notez qu'une commande UPDATE qui
affecte une valeur qui est déjà celle de la colonne sera ignorée, et la colonne
TIMESTAMP ne sera pas modifiée, car la ligne n'est pas à proprement parlée
modifiée. MySQL ignore alors ces modifications pour des raisons d'efficacité).
TIMESTAMP est spécifiée explicitement à NULL.
Les autres colonnes de type TIMESTAMP, hormis la première, peuvent aussi
prendre la valeur courante. Affectez lui alors la valeur NULL ou la fonction
NOW().
Vous pouvez affecter à n'importe quelle colonne de type TIMESTAMP
une valeur différente de l'heure et la date courant en fournissant une valeur
explicite. Cela s'applique aussi à la première colonne de type TIMESTAMP.
Par exemple, si vous voulez affecter la date de création d'une ligne à une
colonne de type TIMESTAMP, mais ne plus y toucher ultérieurement :
TIMESTAMP sa propre valeur.
D'un autre coté, vous pouvez aussi facilement initialiser la colonne TIMESTAMP
avec NOW() lors de sa création, puis ne plus la modifier ultérieurement.
L'intervalle de validité des valeurs TIMESTAMP va du début de l'année 1970
jusque quelque part durant l'année 2037, avec une précision d'une seconde.
Les valeurs sont affichés comme des nombres entiers.
Le format d'affichage des valeurs TIMESTAMP dépend de la taille d'affichage,
comme illustré ci-dessous. Le format total TIMESTAMP a 14 chiffres,
mais les colonnes TIMESTAMP peuvent être créées avec des formats plus courts :
| Type de colonne | Format d'affichage |
TIMESTAMP(14) | YYYYMMDDHHMMSS
|
TIMESTAMP(12) | YYMMDDHHMMSS
|
TIMESTAMP(10) | YYMMDDHHMM
|
TIMESTAMP(8) | YYYYMMDD
|
TIMESTAMP(6) | YYMMDD
|
TIMESTAMP(4) | YYMM
|
TIMESTAMP(2) | YY
|
Toutes les colonnes de type TIMESTAMP ont la même taille de stockage,
indépendamment de la taille d'affichage. Les formats les plus courants sont
6, 8, 12, et 14. Vous pouvez spécifier une taille arbitraire lors de la création
de la table, mais 0 et les valeurs supérieures à 14 sont ramenées à 14.
Les valeurs impaires sont aussi ramenées au nombre pair supérieur.
Vous pouvez spécifier les valeurs des colonnes DATETIME, DATE et
TIMESTAMP, avec les formats communs suivants :
'AAAA-MM-JJ HH:MM:SS' ou 'AA-MM-JJ
HH:MM:SS'. Une syntaxe ``relaxée'' est premise : tout caractère de ponctuation
peut être utilisé comme délimiteur entre les parties de temps ou heure.
Par exemple, '98-12-31 11:30:45', '98.12.31 11+30+45',
'98/12/31 11*30*45', et '98@12@31 11^30^45' sont équivalents.
AAAA-MM-JJ HH:MM:SS' ou 'AA-MM-JJ HH:MM:SS'.
Une syntaxe plus sympas est aussi permise : vous pouvez utiliser
n'importe quel caractère de ponctuation comme délimiteur de date et d'heure.
Par exemple, '98/12/31 11*30*45', et '98@12@31 11^30^45' sont équivalents.
AAAA-MM-JJ' ou 'AA-MM-JJ'. Une syntaxe
plus sympas est aussi acceptée ici. Par exemple, '98-12-31', '98.12.31',
'98/12/31', et '98@12@31' sont équivalent.
AAAAMMJJHHMMSS' ou
'AAMMJJHHMMSS', en supposant qu'une telle chaîne ait un sens en terme de date.
Par exemple '19970523091528' et '970523091528' sont interprétés
comme '1997-05-23 09:15:28', mais '971122129015' est invalide
(les minutes ne sont pas valides) et devient alors '0000-00-00 00:00:00'.
AAAAMMJJ' ou 'AAMMJJ',
en supposant qu'une telle chaîne ait un sens en terme de date. Par exemple, '19970523'
et '970523' sont interprétés comme '1997-05-23', mais '971332'
est invalide (les mois ne sont pas valides) et devient alors '0000-00-00'.
AAAAMMJJHHMMSS ou AAMMJJHHMMSS, en supposant
qu'un tel nombre ait un sens en terme de date. Par exemple, 19830905132800 et
830905132800 sont interprétés comme '1983-09-05 13:28:00'.
AAAAMMJJ ou AAMMJJ en supposant qu'un tel nombre
ait un sens en terme de date. Par exemple, 19830905 et 830905 sont
interprétés comme '1983-09-05'.
DATETIME, DATE, ou TIMESTAMP, tels que NOW() ou CURRENT_DATE.
Les valeurs invalides DATETIME, DATE, ou TIMESTAMP sont remplacées
par la date ``zéro'' du type approprié (respectivement '0000-00-00 00:00:00',
'0000-00-00', ou 00000000000000).
Pour la valeurs spécifiées sous forme de chaînes avec des délimiteurs de date, il n'est
pas nécessaire de spécifier les deux chiffres pour les mois ou les dates qui sont inférieurs
à 10. Par exemple, '1979-6-9' est valide et est équivalent à '1979-06-09'.
Similairement, pour les valeurs spécifiées sous forme de chaîne avec des délimiteurs d'heure,
il n'est pas obligatoire de spécifier les deux chiffres des heures, minutes et secondes qui
sont inférieures à 10. '1979-10-30 1:2:3' est valide et est équivalent à
'1979-10-30 01:02:03'.
Les valeurs spécifiées sous forme de nombres doivent avoir 6, 8, 12, ou 14 chiffres de long.
Si le nombre a 8 ou 14 chiffres, MySQL suppose que le format est AAAAMMJJ ou
AAAAMMJJHHMMSS (respectivement) et que l'année est représentées par les 4 premiers
chiffres. Si le nombre a 6 ou 12 chiffres, MySQL suppose que le format est AAMMJJ ou
AAMMJJHHMMSS (respectivement) et format et que l'année est représentées par les
2 premiers chiffres. Les nombres qui ne sont pas d'une taille valide, sont complétés avec
des 0 jusqu'à la taille lisible la plus proche. Les valeurs spécifiées sous forme de
chaînes sans délimiteurs sont interprétés en fonction de leur taille. Si la chaîne à
8 ou 14 caractères de long, l'année est supposée avoir 4 chiffres. Sinon, l'année est
supposée avoir 2 chiffres. La chaîne est interprétée de gauche à droite, en lisant
successivement l'année, le mois, la date, l'heure, les minutes et les secondes, tant
qu'il y a des valeurs dans la chaîne. Cela signifie que vous ne devez pas utiliser de
chaînes qui ont moins de 6 caractères. Par exemple, si vous spécifiez '9903', en
pensant qu'il représente Mars 1999, vous vous apercevrez que MySQL insère à la place la date
``zéro'' dans votre table. Cela est dû au fait que si l'année et le mois sont 99 et 03,
la date est 0, ce qui en fait une date invalide, qui est rejetée par MySQL.
Les colonnes TIMESTAMP stocke des valeurs légales en utilisant la précision maximum fournie,
indépendamment de la taille d'affichage. Cela a plusieurs implications :
TIMESTAMP(4) ou TIMESTAMP(2). Sinon, la valeur ne sera
pas légale et 0 sera stockée.
ALTER TABLE pour réduire la largeur
d'une colonne TIMESTAMP, les informations qui étaient affichées sont
désormais ``cachées'', mais pas détruites.
TIMESTAMP ne cause aucune
perte d'information, en dehors du fait que ces informations ne sont plus affichées.
TIMESTAMP soient stockées avec une précision d'une
seconde, la seule fonction qui travaille directement avec ces valeurs est la
fonction UNIX_TIMESTAMP(). Les autres fonctions opèrent sur des valeurs
lues et formatées. Cela signifie que vous ne pouvez pas utiliser de fonctions
telles que HOUR() ou SECOND() a moins que le format d'affichage
de la valeur TIMESTAMP ne présente cette valeur. Par exemple, les heures
ne sont jamais affichées dans une colonne de type TIMESTAMP à moins que
la taille d'affichage de la colonne ne soit d'au moins 10. L'utilisation de la
fonction HOUR() sur une valeur ayant un format d'affichage plus court
que 10 retournera un résultat inutilisable.
Dans une certaines mesure, vous pouvez assigner des valeurs d'une colonne à une autre colonne d'un autre type. Cependant, vous devez vous attendre à quelques altération ou pertes de valeurs durant la conversion :
DATE à une colonne de type DATETIME ou
TIMESTAMP, la partie représentant les heures vaudra '00:00:00', car
les colonnes de type DATE ne contiennent pas d'information d'heure.
DATETIME ou TIMESTAMP à une colonne de
type DATE, la composante heure sera perdue, car les colonnes de type
DATE ne contiennent pas d'information d'heure.
DATETIME, DATE, et TIMESTAMP
peuvent être spécifiée avec différents formats, ces types n'ont pas les mêmes
intervalle de validité. Par exemple, les valeurs de type TIMESTAMP
ne peuvent pas prendre de valeur antérieure à 1970 ou postérieure à 2037.
Cela signifie qu'une date telle que '1968-01-01', est légale dans les
colonnes de type DATETIME, mais n'est pas valide pour les TIMESTAMP,
et sera convertie en date zéro (0) si elle est assignée à une telle colonne.
Attention à certains pièges concernant les spécifications de dates :
10:11:12' ressemble à une heure, à cause du
délimiteur ``:'', mais avec une colonne de date, elle sera interprétée
comme la date '2010-11-12'. La valeur '10:45:15' sera convertie
en '0000-00-00' car '45' n'est pas un mois valide.
00-31, mois 00-12, années 1000-9999.
N'importe quelle date qui n'est pas dans cette marge retournera 0000-00-00.
Veuillez noter que ceci vous permet toujours de stocker les dates inadmissibles
telles que 2002-04-31. Il permet à des applications web de stocker
des données d'une forme sans vérifier plus loin. Pour s'assurer qu'une date
est valide, vous devrez effectuer un test dans votre application.
00-69 sont converties en 2000-2069.
70-99 sont converties en 1970-1999.
TIME
MySQL lit et affiche les colonnes de type TIME au format 'HH:MM:SS'
(ou 'HHH:MM:SS' pour les grandes quantités d'heures).
Les valeurs de TIME vont de '-838:59:59' à '838:59:59'.
La raison de cet intervalle de validité si large est que les colonnes de type TIME peuvent
être utilisés pour représenter non seulement des heures du jour, mais aussi des durées entre
deux événements (ce qui peut dépasser largement les 24 heures, ou même, être négatif).
Vous pouvez spécifier une valeur de type TIME avec différents formats :
'D HH:MM:SS.fraction'. (Notez que MySQL ne stockera pas
la fraction d'une valeur TIME.)
Vous pouvez aussi utiliser l'une des syntaxes alternatives suivantes :
HH:MM:SS.fraction, HH:MM:SS, HH:MM, D HH:MM:SS,
D HH:MM, D HH ou SS. Ici, D peut prendre des valeurs entre 0 et 33.
'HHMMSS', en supposant que cela puisse avoir
un sens en terme de date. Par exemple, '101112' est interprété comme '10:11:12', mais
'109712' est invalide (le nombre de minutes n'a pas de sens), et devient la date zéro : '00:00:00'.
HHMMSS, en supposant que cela puisse avoir un sens en terme
de date. Par exemple, 101112 est interprété comme '10:11:12'.
Les formats alternatifs sont aussi compris : SS, MMSS, HHMMSS et HHMMSS.fraction.
Notez que MySQL ne stocke pas encore les fractions de secondes.
TIME, comme CURRENT_TIME.
Pour les valeurs TIME spécifiées avec des délimiteurs, il n'est pas nécessaire de préciser deux
chiffres pour les valeurs inférieurs à 10 pour les heures, minutes et secondes.
'8:3:2' est la même chose que '08:03:02'.
Soyez soigneux lors de l'utilisation de valeurs ``courtes'' à une colonne de type TIME.
MySQL interprète les valeurs en supposant que les chiffres de droite représentent les secondes
(MySQL interprète les valeurs TIME comme des durées et non comme des heures d'une journée).
Par exemple, vous pouvez penser que les valeurs '11:12', '1112' et 1112 représentent '11:12:00'
(12 minutes après 11 heures), mais MySQL les interprétera comme '00:11:12'
(11 minutes, 12 secondes). Similairement, '12' et 12 représentent '00:00:12'.
Les valeurs de TIME déclarées avec des :, au contraire, sont toujours traités comme
des heures de journée. '11:12' signifiera '11:12:00' et non pas 00:11:12
Les valeurs hors de l'intervalle de validité de TIME mais qui sont valides sont ramenées
à la valeur maximale stockable la plus proche. Par exemple, '-850:00:00' et '850:00:00'
sont respectivement converties en '-838:59:59' et '838:59:59'.
Les valeurs TIME non valides sont transformées en date zéro '00:00:00'. Notez que comme
'00:00:00' est elle-même une valeur TIME valide, vous n'aurez pas le moyen de faire la
différence entre une valeur '00:00:00' stockée en connaissance de cause, et '00:00:00'
stockée à cause d'une erreur.
YEAR
Le type YEAR est un type d'1 byte utilisé pour représenter les années.
MySQL extrait et affiche la valeur de YEAR au format YYYY.
L'échelle va de 1901 à 2155.
Vous pouvez spécifier la valeur de YEAR en plusieurs formats :
'1901' et '2155'.
1901 et 2155.
'00' et '99'. Les valeurs entre
'00' et '69' et entre '70' et '99' sont respectivement
converties en valeurs YEAR comprises entre 2000 et 2069 d'une part,
et 1970 et 1999 de l'autre.
1 et 99. Les valeurs entre 1
et 69 et entre 70 et 99 sont respectivement converties en
valeurs YEAR comprises entre 2001 et 2069 d'une part, et 1970
et 1999 d'autre part. Notez que le rang de valeurs pour les nombres à deux chiffres
est totalement différent du rang pour les chaînes à deux chiffres parce que vous ne pouvez
pas spécifier deux zéro directement en tant que nombre et le faire interpréter en tant
que 2000. Vous devez le spécifier comme chaîne '0' ou '00'
sinon il sera interprété comme 0000.
YEAR, comme as NOW().
Les valeurs illégales pour YEAR sont converties en 0000.
Les types chaînes sont CHAR, VARCHAR, BLOB, TEXT,
ENUM, et SET. Cette section décrit comment ces types fonctionnent,
leur besoins en espace et comment les utiliser dans vos requêtes.
| Type | Taille maximale | Bytes |
TINYTEXT ou TINYBLOB | 2^8-1 | 255 |
TEXT ou BLOB | 2^16-1 (64K-1) | 65535 |
MEDIUMTEXT ou MEDIUMBLOB | 2^24-1 (16M-1) | 16777215 |
LONGBLOB | 2^32-1 (4G-1) | 4294967295 |
CHAR et VARCHAR
Les types CHAR et VARCHAR sont similaires, mais diffèrent dans
la manière dont ils sont stockés et récupérés.
La longueur d'une colonne CHAR est fixée à la longueur que vous avez défini
lors de la création de la table. La longueur peut être n'importe quelle valeur entre
1 and 255. (Dans la version 3.23 de MySQL, la longueuer est comprise entre 0 et 255.)
Quand une valeur CHAR est enregistrée, elle est complété à droite avec des espaces
jusqu'à atteindre la valeur fixée. Quand une valeur de CHAR est lue, les espaces
en trop sont retirés.
Les valeurs contenues dans les colonnes de type VARCHAR sont de tailles variables.
Vous pouvez déclarer une colonne VARCHAR pour que sa taille soit comprise entre 1 et 255, exactement
comme pour les colonnes CHAR. Par contre, contrairement à CHAR, les valeurs de VARCHAR
sont stockées en utilisant autant de caractères que nécessaire, plus un octet pour mémoriser la longueur.
Les valeurs ne sont pas complétées. Au contraire, les espaces finaux sont supprimés avant stockage (ce qui
ne fait pas partie des spécifications ANSI SQL).
Si vous assignez une chaîne de caractères qui dépasse la capacité de la colonne CHAR ou VARCHAR,
celle ci est tronquée jusqu'à la taille maximale du champ.
Le tableau suivant illustre les différences entre les deux types de colonnes en
montrant les différences entre l'enregistrement dans une colonne CHAR(4) ou
VARCHAR(4) :
| Valeur | CHAR(4) | Espace requis | VARCHAR(4) | Espace requis |
'' | ' ' | 4 octets | '' | 1 octet |
'ab' | 'ab ' | 4 octets | 'ab' | 3 octets |
'abcd' | 'abcd' | 4 octets | 'abcd' | 5 octets |
'abcdefgh' | 'abcd' | 4 octets | 'abcd' | 5 octets |
Les valeurs lues dans les colonnes de type CHAR(4) et VARCHAR(4) seront les mêmes
dans tous les cas, car les espaces finaux sont retirés des valeurs issues de colonnes de type
CHAR lors de la lecture.
Les valeurs dans les colonnes CHAR et VARCHAR sont classées et
comparées sans tenir compte de la casse, à moins que l'attribut BINARY n'ai
été spécifié lors de la création de la table.
L'attribut BINARY signifie que les valeurs sont classées et triées en tenant
compte de la casse, suivant l'ordre des caractères ASCII de la machine ou est installé
le serveur MySQL. BINARY n'affecte pas les méthodes de lecture et de stockage des valeurs.
L'attribut BINARY se propage dans une expression : il suffit qu'une seule colonne,
utilisée dans une expression, ait l'attribut BINARY pour que toute l'expression ne tienne plus
compte de la casse.
MySQL peut changer automatiquement le type d'une colonne CHAR ou VARCHAR
lors de la création de la table.
See section 6.5.3.1 Modification automatique du type de colonnes.
BLOB et TEXT
Une valeur de type BLOB est un objet binaire de grande taille, qui peut contenir
une quantité variable de données.
Les quatre types BLOB (TINYBLOB, BLOB,
MEDIUMBLOB, et LONGBLOB) ne différent que par la taille maximale de données
qu'ils peuvent stocker.
See section 6.2.6 Capacités des colonnes.
Les quatre types TEXT (TINYTEXT, TEXT, MEDIUMTEXT, et
LONGTEXT correspondent aux types BLOB équivalents, et ont les mêmes contraintes
de stockage.
Les seules différences entre les colonnes de type BLOB et celles de type TEXT
se situent aux niveau des tris et comparaisons : Les tris, faits sur les BLOB, contrairement
à ceux faits sur les TEXT, tiennent compte de la casse.
En d'autres termes, une valeur TEXT est une valeur BLOB insensible à la casse.
Si vous assignez une valeur trop grande à une colonne de type BLOB ou
TEXT, la valeur sera tronquée à la taille maximale possible.
Dans la majorité des cas, vous pouvez considérer une colonne de type TEXT comme
une colonne de type VARCHAR, aussi grande que vous le souhaitez. De même,
vous pouvez considérer une colonne de type BLOB comme une colonne de type
VARCHAR BINARY.
Les seules différences sont :
BLOB ou TEXT qu'à partir de
la version 3.23.2 de MySQL.
BLOB et TEXT, ce qui est le cas dans pour les
colonnes de type VARCHAR.
BLOB et TEXT ne peuvent avoir de valeur par défaut. (DEFAULT)
MyODBC considère les valeurs BLOB comme des LONGVARBINARY et
les valeurs TEXT comme des LONGVARCHAR.
Vous pouvez rencontrer les problèmes suivants, à cause de la grande taille des colonnes de
type BLOB et TEXT, lors de leur utilisation :
GROUP BY ou ORDER BY sur une
colonne de type BLOB ou TEXT, vous devez d'abord la convertir en
un objet de taille fixe.
Le meilleur moyen est d'utiliser la fonction SUBSTRING. Par exemple :
mysql> SELECT comment FROM nom_de_table,SUBSTRING(comment,20) AS substr
-> ORDER BY substr;
Si vous le ne faites pas, seuls les max_sort_length premiers octets de
la colonne seront utilisés pour le tri.
La valeur par défaut de max_sort_length est 1024. Cette valeur peut être
modifiée en utilisant l'option -O au démarrage du serveur mysqld.
Vous pouvez utiliser la commande GROUP BY sur une colonne de type BLOB
ou TEXT en spécifiant la position de la colonne, ou avec un alias :
mysql> SELECT id,SUBSTRING(blob_col,1,100) FROM nom_de_table GROUP BY 2; mysql> SELECT id,SUBSTRING(blob_col,1,100) AS b FROM nom_de_table GROUP BY b;
BLOB ou TEXT est déterminée par son type,
mais la valeur la plus grande que vous pouvez transmettre au programme client est
déterminée par la quantité de mémoire disponible sur le serveur et par les tailles
des buffers de communication.
Vous pouvez changer la taille des buffers de communication, mais vous devez le faire
sur le serveur et le client en même temps. See section 5.5.2 Réglage des paramètres du serveur.
Notez que chaque valeur BLOB ou TEXT est représentée en interne par un
objet alloué séparément, contrairement à tous les autres types de colonne, pour lesquels
la place de stockage est allouée une fois pour chaque colonne, lorsque la table est ouverte.
ENUM
Une énumération ENUM est une chaîne dont la valeur est choisie parmi une liste
de valeurs autorisées lors de la création de la table.
Cette chaîne peut aussi être la chaîne vide ("") ou NULL dans certaines circonstances :
ENUM (c'est à dire,
une chaîne qui n'est pas dans la liste de valeurs autorisées), la chaîne vide est insérée
pour représenter une erreur. Cette chaîne peut être distinguée d'une chaîne vide 'normale' par
le fait que cette chaîne à la valeur numérique 0. Nous reviendrons sur ce point plus tard.
NULL, NULL devient aussi une valeur autorisée,
et la valeur par défaut est alors NULL.
Si une colonne d'énumération est déclarée NOT NULL, la valeur par défaut est le premier
élément de la liste des valeurs autorisées.
Chaque élément de l'énumération dispose d'un index :
mysql> SELECT * FROM nom_de_table WHERE enum_col=0;
NULL est NULL.
Par exemple, une colonne créée comme ENUM("un", "deux", "trois") peut prendre
n'importe quelle valeur ci-dessous. L'index de chaque valeur est aussi présenté :
| Valeur | Index |
NULL | NULL
|
"" | 0 |
"un" | 1 |
"deux" | 2 |
"trois" | 3 |
Une énumération peut avoir un maximum de 65535 éléments.
A partir de la version 3.23.51, les espaces en début et fin de chaîne sont
automatiquement supprimés des éléments de l'énumération ENUM lorsque la
table est créée.
La casse des lettres est sans importance lors de l'assignation de valeurs dans une énumération. Cependant, les valeurs lues dans la base auront la même casse que celle spécifiée lors de la création de la table.
Si vous lisez le contenu d'une énumération dans un contexte numérique, l'index de la
valeur ENUM sera retournée. Par exemple, vous pouvez lire des valeurs numériques
comme ceci :
mysql> SELECT enum_col+0 FROM nom_de_table;
Si vous stockez un nombre dans une colonne de type ENUM, le nombre sera traité comme
un index, et la valeur stockée sera celle de l'élément ayant cet index (Attention, cela ne fonctionnera
pas avec les commandes LOAD DATA, car cette dernière traite toutes les valeurs comme des chaînes).
Il est déconseillé de stocker des valeurs numériques dans un ENUM car cela engendre des
confusions.
Les valeurs de type ENUM sont triées en fonction de l'ordre des éléments, fixé à la création de la
table (en d'autres termes, les valeurs ENUM sont stockées en fonction de leur index). Par exemple,
"a" précède "b" dans l'énumération ENUM("a", "b"), mais "b" précède "a" dans
l'énumération ENUM("b", "a"). La chaîne vide précède toujours les chaînes non vides,
et NULL précède toutes les valeurs.
Si vous voulez connaître toutes les valeurs possibles d'une colonne de type ENUM, pensez à utiliser
cette commande : SHOW COLUMNS FROM nom_de_table LIKE enum_column_name, puis analysez la définition
de la colonne de type ENUM (deuxième colonne dans le résultat).
SET
Un SET est une chaîne qui peut avoir zéro ou plusieurs valeurs, chacune
doit être choisie dans une liste de valeurs définies lors de la création de la table.
Les valeurs des colonnes SET composées de plusieurs membres sont définies en
séparant celles-ci avec des virgules (`,'). Ce qui fait que la valeur d'un membre
de SET ne peut contenir lui même de virgule.
Par exemple, une colonne définie en tant que SET("un", "deux") NOT NULL peut avoir
l'une de ces valeurs :
"" "un" "deux" "un,deux"
Un SET peut avoir au plus 64 membres.
A partir de la version 3.23.51, les espaces en trop sont automatiquement effacés
des membres de SET lorsque la table est créée.
MySQL enregistre les valeurs de SET numériquement. Le bit de poids faible
de la valeur correspond alors au premier élément de la liste.
Si vous utilisez une valeur SET dans un contexte numérique, les bits des
éléments dans cet ensemble seront mis à un, et les autres à zéro.
Par exemple, vous pouvez obtenir un entier à partir d'un ensemble comme ceci :
mysql> SELECT col_set+0 FROM nom_de_table;
Si un nombre est enregistré dans une colonne SET, les bits un à un de ce nombre
représenteront les éléments placés dans cet ensemble.
Supposons qu'une colonne est spécifiée en tant que SET("a","b","c","d"), les membres
ont alors les valeurs suivantes :
SET membre | Valeur décimale | Valeur binaire |
a | 1 | 0001
|
b | 2 | 0010
|
c | 4 | 0100
|
d | 8 | 1000
|
Si vous assignez 9 à cette colonne, cela donne 1001 en
binaire, ce qui fait que les valeurs du premier et quatrième membres
"a" et "d" sont sélectionnés et la valeur résultante est
"a,d".
Pour les valeurs se composant de plus d'un membre du SET, l'ordre des membres
n'a pas d'importance lors des insertions. Le nombre d'occurence d'un élément n'importe
pas non plus.
Lorsque la valeur sera lue ultérieurement, chaque élément n'appara&icrirc;tra qu'une seule fois,
et dans l'ordre donné à la déclaration de la colonne. Par exemple, si une colonne est spécifiée
comme SET("a","b","c","d"), alors "a,d", "d,a", et "d,a,a,d,d" seront tous représentés
par "a,d".
Si vous spécifiez une valeur incorrecte dans une colonne SET, la valeur
sera ignorée.
Les valeurs de SET sont triées numériquement. La valeur NULL précède toutes les autres.
Normalement, vous exécuterez un SELECT sur une colonne SET en utilisant l'opérateur
LIKE ou la fonction FIND_IN_SET() :
mysql> SELECT * FROM nom_de_table WHERE set_col LIKE '%value%';
mysql> SELECT * FROM nom_de_table WHERE FIND_IN_SET('value',set_col)>0;
Mais ce qui suit fonctionnera aussi :
mysql> SELECT * FROM nom_de_table WHERE set_col = 'val1,val2'; mysql> SELECT * FROM nom_de_table WHERE set_col & 1;
La première requête cherche les lignes qui correspondent exactement. La seconde ne cherche que les lignes contenant le premier membre du set.
Si vous voulez connaître toutes les valeurs possible d'une colonne SET, vous devez
utiliser : SHOW COLUMNS FROM nom_de_table LIKE nom_colonne_set et étudier la définition
du SET dans la seconde colonne.
Pour une utilisation optimale des capacitées de stockage, essayez d'utiliser
le type le plus optimal dans chaque cas. Par exemple, si une colonnes du type
entier sera utilisée pour des valeurs entre 1 et 99999,
le type MEDIUMINT UNSIGNED sera le plus approprié.
La représentation des valeurs monétaires est un problème commun.
Avec MySQL, vous devrez utiliser le type DECIMAL. Il est sauvegardé
en tant que chaîne, aucune perte de précision ne devrait avoir lieu.
Si la précision n'est pas très importante, vous pouvez utiliser le type
DOUBLE.
Pour une haute précision, vous pouvez toujours transcrire en nombre décimaux,
et les enregistrer dans des BIGINT. Cela vous permettra d'effectuer
tout vos calculs avec des entiers et de convertir à nouveau en nombre décimaux
au besoin.
Pou faciliter l'importation de code SQL issu d'autres systèmes de gestion de bases de données, MySQL convertit les types de colonnes comme le montre le tableau suivant. Cette conversion facilite l'import de structures de tables :
| Other vendor type | MySQL type |
BINARY(NUM) | CHAR(NUM) BINARY
|
CHAR VARYING(NUM) | VARCHAR(NUM)
|
FLOAT4 | FLOAT
|
FLOAT8 | DOUBLE
|
INT1 | TINYINT
|
INT2 | SMALLINT
|
INT3 | MEDIUMINT
|
INT4 | INT
|
INT8 | BIGINT
|
LONG VARBINARY | MEDIUMBLOB
|
LONG VARCHAR | MEDIUMTEXT
|
MIDDLEINT | MEDIUMINT
|
VARBINARY(NUM) | VARCHAR(NUM) BINARY
|
La conversion du type de colonnes s'effectue lors de la création. Si vous créez
une table avec des types issus d'un autre SGBDR puis que vous exécutez la commande
DESCRIBE nom_de_table, MySQL fournira la structure de la table en utilisant
les types équivalents.
Les capacités de stockage de chaque type de colonnes de MySQL sont listés par catégories.
| Type de colonne | Espace requis |
TINYINT | 1 octet |
SMALLINT | 2 octets |
MEDIUMINT | 3 octets |
INT | 4 octets |
INTEGER | 4 octets |
BIGINT | 8 octets |
FLOAT(X) | 4 if X <= 24 or 8 if 25 <= X <= 53 |
FLOAT | 4 octets |
DOUBLE | 8 octets |
DOUBLE PRECISION |