13.2.10.1 SELECT .. . Instruction INTO
La forme SELECT ... INTO
de SELECT
permet un résultat de requête à stocker dans des variables ou à écrire dans un fichier:
-
SELECT ... INTO
sélectionne les valeurs de colonne et les stocke dans des variables.var_list
-
SELECT ... INTO OUTFILE
écrit les lignes sélectionnées dans un fichier. Les terminateurs de colonne et de ligne peuvent être spécifiés pour produire un format de sortie spécifique. -
SELECT ... INTO DUMPFILE
écrit une seule ligne dans un fichier sans aucune mise en forme.
Une instruction SELECT
donnée peut contenir au plus une clause INTO
, bien que comme indiqué par la SELECT
description de la syntaxe (voir Section 13.2.10, » Instruction SELECT « ), le INTO
peut apparaître à différentes positions:
-
Avant
FROM
. Exemple: -
Avant une clause de verrouillage de fin. Exemple:
-
À la fin de
SELECT
. Exemple:
Le INTO
la position à la fin de l’instruction est prise en charge à partir de MySQL 8.0.20, et est la position préférée. La position avant une clause de verrouillage est obsolète à partir de MySQL 8.0.20; attendez-vous à ce qu’elle soit supprimée. en af version actuelle de MySQL. En d’autres termes, INTO
après FROM
mais pas à la fin de SELECT
produit un Attention.
Une clause INTO
ne doit pas être utilisée dans un SELECT
imbriqué car un tel SELECT
doit renvoyer son résultat au contexte extérieur. Il existe également des contraintes sur l’utilisation de INTO
dans les instructions UNION
; voir Section 13.2.10.3, « Clause UNION ».
Pour la variante INTO
: var_list
-
var_list
nomme une liste d’une ou plusieurs variables, chacune pouvant être une variable définie par l’utilisateur, une procédure stockée ou un paramètre de fonction ou une variable locale de programme stockée. (Dans une instructionSELECT ... INTO
préparée, seules les variables définies par l’utilisateur sont autorisées; voir Section 13.6.4.2, « Portée et résolution de la variable locale » .)var_list
-
Les valeurs sélectionnées sont affectées aux variables. Le nombre de variables doit correspondre au nombre de colonnes. La requête doit renvoyer une seule ligne. Si la requête ne renvoie aucune ligne, un avertissement avec le code d’erreur 1329 se produit (
No data
) et les valeurs des variables restent inchangées. Si la requête renvoie plusieurs lignes, l’erreur 1172 se produit (Result consisted of more than one row
). S’il est possible que l’instruction récupère plusieurs lignes, vous pouvez utiliserLIMIT 1
pour limiter le jeu de résultats à une seule ligne.
INTO
peut également être utilisé avec une instruction var_list
TABLE
, sous réserve de ces restrictions:
-
Le nombre de les variables doivent correspondre au nombre de colonnes du tableau.
-
Si la table contient plus d’une ligne, vous devez utiliser
LIMIT 1
pour limiter le jeu de résultats à une seule ligne.LIMIT 1
doit précéder le mot cléINTO
.
Un exemple d’une telle déclaration est affichée ici:
Vous pouvez également sélectionner des valeurs à partir d’une instruction VALUES
qui génère une une seule ligne dans un ensemble de variables utilisateur. Dans ce cas, vous devez utiliser un alias de table et vous devez affecter chaque valeur de la liste de valeurs à une variable. Chacune des deux instructions présentées ici équivaut à SET @x=2, @y=4, @z=8
:
Les noms des variables utilisateur ne sont pas sensibles à la casse . Voir Section 9.4, «Variables définies par l’utilisateur».
La forme SELECT ... INTO OUTFILE "
de file_name
"SELECT
écrit les lignes sélectionnées dans un fichier. Le fichier est créé sur l’hôte du serveur, vous devez donc disposer du privilège FILE
pour utiliser cette syntaxe. file_name
ne peut pas être un fichier existant, ce qui empêche entre autres de modifier des fichiers tels que /etc/passwd
et des tables de base de données. La variable système character_set_filesystem
contrôle l’interprétation du nom de fichier.
L’instruction SELECT ... INTO OUTFILE
est destinée à permettre le vidage d’une table dans un fichier texte sur l’hôte du serveur.Pour créer le fichier résultant sur un autre hôte, SELECT ... INTO OUTFILE
n’est normalement pas approprié car il n’y a aucun moyen d’écrire un chemin vers le fichier par rapport au système de fichiers hôte du serveur, sauf si l’emplacement du Le fichier sur l’hôte distant est accessible à l’aide d’un chemin mappé sur le réseau sur le système de fichiers hôte du serveur.
Alternativement, si le logiciel client MySQL est installé sur l’hôte distant, vous pouvez utiliser une commande client telle que mysql -e "SELECT ..." >
pour générer le fichier sur cet hôte. file_name
SELECT ... INTO OUTFILE
est le complément de LOAD DATA
. Les valeurs de colonne sont écrites converties dans le jeu de caractères spécifié dans la clause CHARACTER SET
. Si aucune clause de ce type n’est présente, les valeurs sont vidées à l’aide du jeu de caractères binary
. En effet, il n’y a pas de conversion de jeu de caractères. Si un jeu de résultats contient des colonnes dans plusieurs jeux de caractères, il en va de même pour le fichier de données de sortie et il peut ne pas être possible de recharger le fichier correctement.
La syntaxe de la partie export_options
de l’instruction se compose des mêmes FIELDS
et LINES
clauses utilisées avec l’instruction LOAD DATA
. Pour plus d’informations sur les clauses FIELDS
et LINES
, y compris leurs valeurs par défaut et les valeurs autorisées, reportez-vous à la Section 13.2.7, « Instruction LOAD DATA » .
FIELDS ESCAPED BY
contrôle comment écrire les caractères spéciaux. Si le caractère FIELDS ESCAPED BY
n’est pas vide, il est utilisé lorsque nécessaire pour éviter toute ambiguïté comme préfixe qui précède les caractères suivants en sortie:
-
Le
FIELDS ESCAPED BY
caractère -
Le caractère
FIELDS ENCLOSED BY
-
Le premier caractère du
FIELDS TERMINATED BY
etLINES TERMINATED BY
valeurs -
ASCII
NUL
(l’octet de valeur zéro; ce qui est réellement écrit après le caractère d’échappement est ASCII0
, pas un octet de valeur zéro)
Les FIELDS TERMINATED BY
, ENCLOSED BY
, ESCAPED BY
, ou les caractères LINES TERMINATED BY
doivent être échappés pour que vous puissiez relire le fichier de manière fiable. ASCII NUL
est échappé pour faciliter la visualisation avec certains pagers.
Le fichier résultant n’a pas besoin d’être conforme à la syntaxe SQL, donc rien d’autre n’a besoin d’être échappé.
Si le caractère FIELDS ESCAPED BY
est vide, aucun caractère n’est échappé et NULL
est affiché sous la forme NULL
, pas \N
. Ce n’est probablement pas une bonne idée de spécifier un caractère d’échappement vide, en particulier si les valeurs de champ dans vos données contiennent l’un des caractères de la liste que vous venez de donner.
INTO OUTFILE
peut également être utilisé avec une instruction TABLE
lorsque vous souhaitez vider toutes les colonnes d’une table dans un fichier texte. Dans ce cas, l’ordre et le nombre de lignes peuvent être contrôlés en utilisant ORDER BY
et LIMIT
; ces clauses doivent précéder INTO OUTFILE
. TABLE ... INTO OUTFILE
prend en charge le même export_options
que SELECT ... INTO OUTFILE
, et il est soumis aux mêmes restrictions lors de l’écriture dans le système de fichiers. Un exemple d’une telle déclaration est montré ici:
Vous pouvez également utiliser SELECT ... INTO OUTFILE
avec une instruction VALUES
pour écrire valeurs directement dans un fichier. Un exemple est montré ici:
Vous devez utiliser un alias de table; Les alias de colonne sont également pris en charge et peuvent éventuellement être utilisés pour écrire des valeurs uniquement à partir des colonnes souhaitées. Vous pouvez également utiliser une ou toutes les options d’exportation prises en charge par SELECT ... INTO OUTFILE
pour formater la sortie dans le fichier.
Voici un exemple qui produit un fichier au format CSV (valeurs séparées par des virgules) utilisé par de nombreux programmes:
Si vous utilisez INTO DUMPFILE
au lieu de INTO OUTFILE
, MySQL écrit une seule ligne dans le fichier, sans aucune terminaison de colonne ou de ligne et sans effectuer de traitement d’échappement. Ceci est utile pour sélectionner une valeur BLOB
et la stocker dans un fichier.
Tout fichier créé par INTO OUTFILE
ou INTO DUMPFILE
appartient à l’utilisateur du système d’exploitation sous le compte duquel mysqld s’exécute. (Vous ne devriez jamais exécuter mysqld en tant que root
pour cette raison et d’autres.) Depuis MySQL 8.0.17, le umask pour la création de fichiers est 0640; vous devez disposer de privilèges d’accès suffisants pour manipuler le contenu du fichier. Avant MySQL 8.0.17, le umask est 0666 et le fichier est accessible en écriture par tous les utilisateurs sur l’hôte du serveur.
Si la variable système secure_file_priv
est définie sur un nom de répertoire non vide, le fichier à écrire doit se trouver dans ce répertoire.
Dans le contexte des instructions SELECT ... INTO
qui se produisent dans le cadre d’événements exécutés par le planificateur d’événements, les messages de diagnostic (non seulement les erreurs, mais aussi les avertissements) sont écrits dans le journal des erreurs et, sous Windows, au journal des événements de l’application. Pour plus d’informations, reportez-vous à la Section 25.4.5, «Statut du planificateur d’événements».
À partir de MySQL 8.0.22, une prise en charge est fournie pour la synchronisation périodique des fichiers de sortie écrits par SELECT INTO OUTFILE
et SELECT INTO DUMPFILE
, activés en définissant la variable système du serveur select_into_disk_sync
introduite dans cette version. La taille du tampon de sortie et le délai facultatif peuvent être défini en utilisant, respectivement, select_into_buffer_size
et select_into_disk_sync_delay
. Pour plus d’informations, consultez les descriptions de ces variables système.