# SQL Mode

Le serveur MySQL peut fonctionner dans différents modes SQL et peut appliquer ces modes différemment pour différents clients, en fonction de la valeur de la variable système sql\_mode. Les administrateurs de base de données peuvent définir le mode SQL global pour répondre aux exigences opérationnelles du serveur de site. Chaque application peut définir son mode de session SQL en fonction de ses propres exigences.

- ALLOW\_INVALID\_DATES

N'effectuez pas de vérification complète des dates. Vérifiez uniquement que le mois est compris entre 1 et 12 et le jour entre 1 et 31.

- ANSI\_QUOTES

Traitez "comme un caractère de citation d’identificateur (comme le` caractère de citation) et non comme un caractère de citation de chaîne.

- ERROR\_FOR\_DIVISION\_BY\_ZERO

Le mode ERROR\_FOR\_DIVISION\_BY\_ZERO affecte le traitement de la division par zéro, ce qui inclut MOD (N, 0). Pour les opérations de changement de données (INSERT, UPDATE), son effet dépend également de l'activation du mode SQL strict.

- - Si ce mode n'est pas activé, la division par zéro insère NULL et ne produit aucun avertissement.

- - Si ce mode est activé, la division par zéro insère NULL et génère un avertissement.

- HIGH\_NOT\_PRECEDENCE

Définiie la précedence de l'opérateur NOT .

- NO\_BACKSLASH\_ESCAPES

Désactive l'utilisation du caractère barre oblique inverse (\\) en tant que caractère d'échappement dans les chaînes. Lorsque ce mode est activé, la barre oblique inverse devient un caractère ordinaire comme un autre.

- NO\_ENGINE\_SUBSTITUTION

Contrôle la substitution automatique du moteur de stockage par défaut lorsqu'une instruction telle que CREATE TABLE ou ALTER TABLE spécifie un moteur de stockage désactivé ou non compilé.

- ANSI

Équivalent à REAL\_AS\_FLOAT, PIPES\_AS\_CONCAT, ANSI\_QUOTES, IGNORE\_SPACE et ONLY\_FULL\_GROUP\_BY.

- TRADITIONAL

Equivalent à STRICT\_TRANS\_TABLES, STRICT\_ALL\_TABLES, NO\_ZERO\_IN\_DATE, NO\_ZERO\_DATE, ERROR\_FOR\_DIVISION\_BY\_ZERO et NO\_ENGINE\_SUBSTITUTION.

# <span class="mw-headline" id="bkmrk-configuration-consei-0">Configuration conseillé</span>

Dans le fichier my.ini initialisé sql\_mode a ANSI et TRADITIONAL. Ces parametres renforce la sécurité et une proximité avec Oracle &lt;source lang='ini'&gt; sql\_mode = "ANSI,TRADITIONAL" &lt;/source&gt;

Une fois redemarré, le nouveaux SQL mode des clients est homogène à &lt;source lang='SQL'&gt;

&lt;/source&gt;

```SQL
+---------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Variable_name | Value |+---------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------------+ 
| sql_mode | REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ONLY_FULL_GROUP_BY,ANSI,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_ENGINE_SUBSTITUTION |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0,04 sec)
```

# <span class="mw-headline" id="bkmrk-test-sql-mode-0">Test SQL Mode</span>

la variable sql\_mode permet de savoir le mode sql par defaut du serveur

```SQL
mysql> SHOW SESSION VARIABLES LIKE 'sql_mode'; 
+---------------+-----------------------------------------------------------------------------------------------------------------------+ 
| Variable_name | Value | 
+---------------+-----------------------------------------------------------------------------------------------------------------------+ 
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION | 
+---------------+-----------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0,00 sec)
```

Il est possible de tester le mode et d'override pour la session la prise en compte du SQL

```SQL
mysql> create table test(i INT); Query OK, 0 rows affected (0,12 sec)

mysql> insert into test values (2/0); ERROR 1365 (22012): Division by 0

mysql> set sql_mode=; Query OK, 0 rows affected (0,00 sec)

mysql> insert into test values (2/0); Query OK, 1 row affected (0,06 sec)
```