Le serveur MySQL peut fonctionner avec différent modes SQL, et, depuis MySQL 4.1, il peut appliquer ces modes au niveau de la connexion du client. Cela permet aux applications d'adapter le comportement du serveur en fonction de leur attentes.
Le mode définit quelle syntaxe SQL MySQL doit supporter, et quels types de vérification il doit faire. Cela rend plus facile l'utilisation de MySQL dans différents environnement, et la connexion avec les autres serveurs de base de données.
Vous pouvez donner un mode SQL par défaut au démarrage de
mysqld
avec l'option
--sql-mode="modes"
. Lav aleur peut aussi être
vide (--sql-mode=""
) si vous voulez la remettre
à 0.
Depuis MySQL 4.1, vous pouvez aussi changer le mode après le
démarrage en modifiant la variable sql_mode
avec la commande SET [SESSION|GLOBAL]
sql_mode='modes'
. Modifier la variable
GLOBAL
affecte les opérations de tous les
clients qui se connecteront. En modifiant la variable
SESSION
, cela n'affectera que le client
courant.
modes
est une liste de modes différents,
séparés par des virgules (‘,
’).
Vous pouvez lire le mode courant avec la commande
SELECT @@sql_mode
. La valeur par défaut est
vide (par de modes configurés).
Change la syntaxe et le comportement pour être plus compatible avec le standard SQL. (Nouveau en MySQL 4.1.1)
Si une valeur n'a pas pu être insérée dans une table transactionnelle sans modification, la commande est annulée. Pour une table non-transactionnelle, la commande est annulée si cela survient dans une ligne unique ou dans la première ligne d'une insertion multiple. Plus de détails sont donnés ultérieurement dans cette section. (Nouveau en MySQL 5.0.2)
MySQL se comporte comme un système SQL ``traditionnel''.
Une description simple est que ce mode ``émet une erreur et
non pas une alerte'' lors de l'insertion d'une valeur
incorrecte dans une colonne.
Note : si vous utilisez un
moteur de table non-transactionnel, les commandes
INSERT
/UPDATE
s'arrêteront dès que l'erreur est repérée, ce qui n'est
pas forcément ce que vous voudrez. (Nouveau en MySQL 5.0.2)
Lorsque cette documentation fait référence au mode strict,
cela signifie qu'au moins un des modes
STRICT_TRANS_TABLES
ou
STRICT_ALL_TABLES
est activé.
La liste suivante présente les différents modes supportés :
N'autorise pas la vérification totale des dates. Vérifie
simplement que le mois est dans l'intervalle de 1 à 12, et
que le jour est dans l'intervalle de de 1 à 31. C'est très
pratique pour les applications Web où la date est obtenue
de 3 champs différents, et que vous voulez stocker
exactement la date saisie sans validation. Ce mode
s'applique aux colonnes de type DATE
et
DATETIME
. Il ne s'applique pas aux
colonnes TIMESTAMP
, qui demandent
toujours une date valide.
Ce mode est nouveau en MySQL 5.0.2. Avant 5.0.2, c'était le
mode par défaut de gestion des dates. Depuis 5.0.2, activer
le mode strict impose au serveur de vérifier la validité
des dates, et non pas seulement les intervalles. Par
exemple, '2004-04-31'
est valide sans le
mode strict, mais ne l'est plus avec le mode strict. Pour
permettre ces valeurs malgré le mode strict, utilisez le
mode ALLOW_INVALID_DATES
.
Traite ‘"
’ comme un
délimiteur d'identifiant (comme le caractère MySQL
‘`
’) et non comme un
délimiteur de chaînes. Vous pouvez toujours utiliser
‘`
’ pour délimiter les
identifiants en mode ANSI. Avec
ANSI_QUOTES
activée, vous ne pouvez pas
utiliser les guillemets doubles pour délimiter une chaîne
de caractères, car ce sera uniquement interprété comme un
identifiant. (Nouveau en MySQL 4.0.0.)
Produit une erreur en mode strict et sinon une alerte,
lorsque MySQL doit tenter une division par 0 ou un
MOD(X,0)
) durant une commande
INSERT
/ UPDATE
. Si ce
mode n'est pas activé, MySQL retourne simplement
NULL
pour les divisions par zéro. Si
utilisé avec l'attribut IGNORE
, MySQL
génère une alerte pour les divisions par zéro, mais le
résultat de l'opération sera NULL
.
(Nouveau en MySQL 5.0.2)
Permet les espaces entre le nom de la fonction et le
caractère ‘(
’. Cela force
les noms de fonctions a être traités comme des mots
réservés. En conséquence, si vous voulez accéder aux
bases, tables et colonnes dont le nom est un mot réservé,
vous devez le mettre entre délimiteurs. Par exemple, comme
la fonction USER()
existe, le nom de la
table user
de la base
mysql
et la colonne
User
de cette table doivent être
protégés :
SELECT "User" FROM mysql."user";
(Nouveau en MySQL 4.0.0.)
NO_AUTO_VALUE_ON_ZERO
affecte la gestion
des colonnes de type AUTO_INCREMENT
.
Normalement, vous générez le prochain numéro de séquence
dans la colonne en insérant soit NULL
soit 0
dedans.
NO_AUTO_VALUE_ON_ZERO
supprime ce
comportement pour 0
pour que seule la
valeur NULL
génère le prochain numéro
de séquence. Ce mode est utile si vous avez stocké la
valeur 0
dans la colonne
AUTO_INCREMENT
de la table. Ce n'est pas
recommandé. Par exemple, si vous voulez exporter une table
avec mysqldump
et que vous la rechargez,
normalement MySQL va générer de nouveaux identifiants pour
les lignes avec la valeur 0
, ce qui
entraînera une différence avec la table originale. En
activant NO_AUTO_VALUE_ON_ZERO
avant de
recharger le fichier exporter, vous éviter de problème.
Depuis MySQL 4.1.1, mysqldump
va
automatiquement inclure les commandes nécessaires dans
l'export, pour activer
NO_AUTO_VALUE_ON_ZERO
. (Nouveau en MySQL
4.1.1.)
Lors de la création d'une table, ignore les directives
INDEX DIRECTORY
et DATA
DIRECTORY
. Cette option est pratique sur un
esclave de réplication. (Nouveau en MySQL 4.0.15.)
N'affiche pas les options spécifiques à MySQL dans le
résultat de SHOW CREATE TABLE
. Ce mode
est utilisé par mysqldump
dans un souci
de portabilité. (Nouveau en MySQL 4.1.1.)
N'affiche pas les options spécifiques à MySQL dans le
résultat de SHOW CREATE TABLE
. Ce mode
est utilisé par mysqldump
dans un souci
de portabilité. (Nouveau en MySQL 4.1.1.)
N'affiche pas les options de tables spécifiques à MySQL
(comme ENGINE
) dans le résultat de
SHOW CREATE TABLE
. Ce mode est utilisé
par mysqldump
dans un souci de
portabilité. (Nouveau en MySQL 4.1.1.)
Ne permet pas l'utilisation de
'0000-00-00'
comme date valide. Vous
pouvez toujours insérer des dates nulles avec l'option
IGNORE
. (Nouveau en MySQL 5.0.2)
N'accepte pas les dates où le mois ou le jour vaut 0. Si
utilisé avec L'option IGNORE
, la date
'0000-00-00'
sera insérée pour chaque
date invalide. (Nouveau en MySQL 5.0.2)
Dans les opérations de soustraction, ne marque pas le
résultat UNSIGNED
si un des opérandes
est non signé. Notez que cela fait que UNSIGNED
BIGINT
n'est plus totalement utilisable dans tous
les contextes. See Section 12.7, « Fonctions de transtypage ».
(Nouveau en MySQL 4.0.2.)
N'autorise pas les requêtes dont la clause GROUP
BY
fait référence à une colonne qui n'est pas
sélectionnée. (Nouveau en MySQL 4.0.0.)
Traite ||
comme un opérateur de
concaténation (identique à CONCAT()
) au
lieu d'être un synonyme de OR
. (Nouveau
en MySQL 4.0.0.)
Traite le type REAL
comme un synonyme
FLOAT
plutôt que comme un synonyme de
DOUBLE
. (Nouveau en MySQL 4.0.0.)
Active le mode strict pour tous les moteurs de stockage. Les valeurs invalides sont rejetées. Plus de détails suivent. (Nouveau en MySQL 5.0.2)
Active le mode strict pour tous les moteurs de stockage transactionnels. Les valeurs invalides sont rejetées. Plus de détails suivent. (Nouveau en MySQL 5.0.2)
Lorsque le mode strict est activé, MySQL retourne une erreur si
une valeur est invalide ou manquante (aucune valeur fournie pour
la colonne, et la colonne n'a pas de valeru
DEFAULT
explicite dans sa définition). Pour
les tables transactionnelles, cela arrive lorsque le mode
STRICT_ALL_TABLES
et
STRICT_TRANS_TABLES
est activé. La commande
est alors annulée. Pour les tables non-transactionnelles, MySQL
gère les valeurs invalides comme ceci :
si la commande insère ou modifie une seule ligne, l'erreur survient si la valeur est invalide ou manquante. La commande est annulée et la table reste intacte. Si la commande insère ou modifie plusieurs lignes, l'effet dépend de l'option stricte activée :
Pour le mode STRICT_ALL_TABLES
, si une
valeur est invalide ou manquante dans la première ligne,
MySQL retourne une erreur et aucune ligne n'est modifiée.
Si une valeur est invalide ou manquante à partir de la
seconde ligne, MySQL retourne une erreur et ignore le reste
des lignes. Cependant, dans ce cas, les premières lignes
restent modifiées ou insérées. Cela signifie que vous
risquez d'obtenir une opération partielle, ce qui n'est pas
forcément souhaitable. Pour éviter cela, il est alors
recommandé d'utiliser des commandes uni-lignes.
Pour le mode STRICT_TRANS_TABLES
, si une
valeur est invalide ou manquante pour la première ligne,
MySQL retourne une erreur et aucune ligne n'est modifiée.
Pour les lignes suivantes, si une valeur est invalide, MySQL
insère la valeur valide la plus proche. Si une valeur
manque, MySQL insère explicitement la valeur par défaut
pour ce type de données. Dans ce cas, MySQL génère une
alerte, et continue le traitement.
Le mode strict interdit l'utilisation de dates invalides comme
'2004-04-31'
. Il n'interdit pas les dates
avec des 0 comme 2004-04-00'
ou encore les
dates ``zéro''. Pour les interdire, il faut activer les modes
NO_ZERO_IN_DATE
et
NO_ZERO_DATE
.
Si vous n'utilisez pas de mode strict, c'est à dire ni
STRICT_TRANS_TABLES
ni
STRICT_ALL_TABLES
, MySQL génère une alerte
pour toutes les valeurs qui sont adaptées pour être
insérées. See Section 13.5.3.19, « SHOW WARNINGS | ERRORS
».
Les modes suivants sont fournis comme raccourcis pour
différentes combinaisons des valeurs précédentes. Tous les
raccourcis sont disponibles depuis MySQL 4.1.1,
hormisTRADITIONAL
(5.0.2).
Equivalent à REAL_AS_FLOAT
,
PIPES_AS_CONCAT
,
ANSI_QUOTES
,
IGNORE_SPACE
,
ONLY_FULL_GROUP_BY
. See
Section 1.5.3, « Exécuter MySQL en mode ANSI ».
Equivalent à PIPES_AS_CONCAT
,
ANSI_QUOTES
,
IGNORE_SPACE
,
NO_KEY_OPTIONS
,
NO_TABLE_OPTIONS
,
NO_FIELD_OPTIONS
.
Equivalent à PIPES_AS_CONCAT
,
ANSI_QUOTES
,
IGNORE_SPACE
,
NO_KEY_OPTIONS
,
NO_TABLE_OPTIONS
,
NO_FIELD_OPTIONS
.
Equivalent à PIPES_AS_CONCAT
,
ANSI_QUOTES
,
IGNORE_SPACE
,
NO_KEY_OPTIONS
,
NO_TABLE_OPTIONS
,
NO_FIELD_OPTIONS
.
Equivalent à NO_FIELD_OPTIONS
.
Equivalent à NO_FIELD_OPTIONS
.
Equivalent à PIPES_AS_CONCAT
,
ANSI_QUOTES
,
IGNORE_SPACE
,
NO_KEY_OPTIONS
,
NO_TABLE_OPTIONS
,
NO_FIELD_OPTIONS
.
Equivalent à PIPES_AS_CONCAT
,
ANSI_QUOTES
,
IGNORE_SPACE
,
NO_KEY_OPTIONS
,
NO_TABLE_OPTIONS
,
NO_FIELD_OPTIONS
.
Equivalent à STRICT_TRANS_TABLES
,
STRICT_ALL_TABLES
,
NO_ZERO_IN_DATE
,
NO_ZERO_DATE
,
ERROR_FOR_DIVISION_BY_ZERO
.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.