Options de ligne de commande de mysqld
<<<
Le mode SQL du serveur Variables serveur système
>>>

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).

    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 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 :
    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 :
    
    SELECT "User" FROM mysql."user";
    
    (Nouveau en MySQL 4.0.0.)
    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)
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. 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 .

<< Le mode SQL du serveur >>
Options de ligne de commande de mysqld Configuration de MySQL Variables serveur système