MySQL/Variables utilisateurs

Variables locales

modifier

Les types des variables MySQL sont forcément scalaires[1]. Pour une "variable tableau", il faut donc créer une table temporaire ou concaténer chaque ligne.

Les variables locales ne peuvent pas être lues en dehors de leur fonction ou procédure stockée[2].

Elles sont déclarées après DECLARE avec leur nom, leur type, et éventuellement leur valeur par défaut[3] :

DECLARE MaVariable1 INT DEFAULT 1;

Variables de session

modifier

Les variables obéissent à certaines règles :

  • Leurs noms commencent par "@" (ex : @total).
  • Elles sont déclarées avec le mot SET, ou bien SELECT accompagné de l'opérateur d'assignation :=.
  • Une variable définie dans la liste de champ ne peut pas être utilisée comme une condition.
  • Les variables de session durent le temps du thread.
 select @test := 2;
 select @test + 1;  -- renvoie 3

 set @datedebut='date_de_debut', @datefin='date_de_fin';

 SELECT @nbmembre:=count(*) FROM membres;
	
 select @numzero := count(*) from table1 where field=0; 
 select @numdistint := count(distinct field) from table1 where field <> 0 ; 
 select @numzero @numdistinct;

Pour copier dans valeurs d'une sélection dans une ou plusieurs variables :

 SET @id = 0, @nom = '';
 SELECT id, nom INTO @id, @nom FROM table1 LIMIT 1;
 SELECT @id, @nom;

Elles peuvent être utiles quand on doit agréger plusieurs valeurs sans jointures entre leurs tables. Ex :

 SET @idCountry = (SELECT `id` FROM `country` WHERE `code` = "FR" LIMIT 1);
 SET @idLanguage = (SELECT `id` FROM `language` WHERE `code` = "fr" LIMIT 1);

 INSERT INTO `page` (`country`, `language`, `description`)
 VALUES (@idCountry, @idLanguage, 'Text')

Variables globales

modifier

Une variable globale est visible pour tous les utilisateurs, elle est précédée de "@@".

Elles peuvent modifier les fichiers de configuration définitivement pendant la session. Donc en les changeant, il est nécessaire de préciser le critère définitif ou éphémère, en distinguant set global et set session.

Exemple :

mysql> set @@global.max_connections = 1000;
mysql> show global variables like 'wait_timeout';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wait_timeout  |    60 |
+---------------+-------+
1 row in set (0.00 sec)
mysql> set @@session.wait_timeout=120;

sql_mode

modifier

Un script peut avoir un comportant différent sur deux bases tournant sur la même version de MySQL. Par exemple il est possible d'imposer de préciser dans le GROUP BY toutes les variables sélectionnées à regrouper avec ONLY_FULL_GROUP_BY.

Ce paramétrage est visible avec sql_mode[4] :

 SELECT @@sql_mode;
ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Pour le modifier au démarrage dans Docker compose :

    command:
      --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

Références

modifier