| 5.2 Configuration de MySQL
 5 Administration du serveur
 Manuel de Référence MySQL 4.1 : Version Française
 
 . Options de ligne de commande de mysqld
 ->Le mode SQL du serveur
 . Variables serveur système
 . Variables de statut du serveur
 
 
 | 
  5.2.2 Le mode SQL du serveur 
 
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).
 
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 :
     ANSI
     
Change la syntaxe et le comportement pour être plus compatible avec
le standard SQL. (Nouveau en MySQL 4.1.1)
      
     STRICT_TRANS_TABLES
     
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)
      
     TRADITIONAL
     
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 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 :
     ALLOW_INVALID_DATES
     
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
 .
      
ANSI_QUOTES
 
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.)
      
     ERROR_FOR_DIVISION_BY_ZERO
     
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)
      
IGNORE_SPACE
 
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 :  
(Nouveau en MySQL 4.0.0.)| 
SELECT "User" FROM mysql."user";
 | 
 
NO_AUTO_VALUE_ON_ZERO
 
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.)
      
NO_DIR_IN_CREATE
 
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.)
      
NO_FIELD_OPTIONS
 
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.)
      
NO_KEY_OPTIONS
 
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.)
      
NO_TABLE_OPTIONS
 
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.)
      
     NO_ZERO_DATE
     
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)
      
     NO_ZERO_IN_DATE
     
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)
      
NO_UNSIGNED_SUBTRACTION
 
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.  Fonctions de transtypage .
(Nouveau en MySQL 4.0.2.)
      
ONLY_FULL_GROUP_BY
 
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.)
      
PIPES_AS_CONCAT
 
Traite  
||
  comme un opérateur de concaténation (identique à  
CONCAT()
 )
au lieu d'être un synonyme de  
OR
 .
(Nouveau en MySQL 4.0.0.)
      
REAL_AS_FLOAT
 
Traite le type  
REAL
  comme un synonyme  
FLOAT
  plutôt que comme un
synonyme de  
DOUBLE
 .
(Nouveau en MySQL 4.0.0.)
      
     STRICT_ALL_TABLES
     
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)
      
     STRICT_TRANS_TABLES
     
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)
      
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.
 Syntaxe de 
SHOW WARNINGS
 . 
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,
hormis 
TRADITIONAL
  (5.0.2).
 
     ANSI
     
Equivalent à
 
REAL_AS_FLOAT
 ,  
PIPES_AS_CONCAT
 ,  
ANSI_QUOTES
 ,  
IGNORE_SPACE
 ,  
ONLY_FULL_GROUP_BY
 .  Exécuter MySQL en mode ANSI .
      
     DB2
     
Equivalent à
 
PIPES_AS_CONCAT
 ,  
ANSI_QUOTES
 ,  
IGNORE_SPACE
 ,  
NO_KEY_OPTIONS
 ,  
NO_TABLE_OPTIONS
 ,  
NO_FIELD_OPTIONS
 .
      
     MAXDB
     
Equivalent à
 
PIPES_AS_CONCAT
 ,  
ANSI_QUOTES
 ,  
IGNORE_SPACE
 ,  
NO_KEY_OPTIONS
 ,  
NO_TABLE_OPTIONS
 ,  
NO_FIELD_OPTIONS
 .
      
     MSSQL
     
Equivalent à
 
PIPES_AS_CONCAT
 ,  
ANSI_QUOTES
 ,  
IGNORE_SPACE
 ,  
NO_KEY_OPTIONS
 ,  
NO_TABLE_OPTIONS
 ,  
NO_FIELD_OPTIONS
 .
      
     MYSQL323
     
Equivalent à
 
NO_FIELD_OPTIONS
 .
      
     MYSQL40
     
Equivalent à
 
NO_FIELD_OPTIONS
 .
      
     ORACLE
     
Equivalent à
 
PIPES_AS_CONCAT
 ,  
ANSI_QUOTES
 ,  
IGNORE_SPACE
 ,  
NO_KEY_OPTIONS
 ,  
NO_TABLE_OPTIONS
 ,  
NO_FIELD_OPTIONS
 .
      
     POSTGRESQL
     
Equivalent à
 
PIPES_AS_CONCAT
 ,  
ANSI_QUOTES
 ,  
IGNORE_SPACE
 ,  
NO_KEY_OPTIONS
 ,  
NO_TABLE_OPTIONS
 ,  
NO_FIELD_OPTIONS
 .
      
     TRADITIONAL
     
Equivalent à
 
STRICT_TRANS_TABLES
 ,  
STRICT_ALL_TABLES
 ,  
NO_ZERO_IN_DATE
 ,
 
NO_ZERO_DATE
 ,  
ERROR_FOR_DIVISION_BY_ZERO
 .      |