Dans MariaDB, le LOAD_FILE()
La fonction lit un fichier et renvoie le contenu du fichier sous forme de chaîne.
Syntaxe
La syntaxe ressemble à ceci :
LOAD_FILE(file_name)
Où file_name
est le chemin d'accès complet au fichier.
Exemple
Supposons que nous ayons un fichier appelé pets.csv
qui contient le texte suivant :
1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat"
Nous pouvons utiliser le LOAD_FILE()
fonction pour lire et renvoyer ce contenu :
SELECT LOAD_FILE('/Users/barney/data/pets.csv');
Résultat :
+---------------------------------------------+ | LOAD_FILE('/Users/barney/data/pets.csv') | +---------------------------------------------+ | 1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat" | +---------------------------------------------+ 1 row in set (0.186 sec)
Dans ce cas, le chemin d'accès complet au fichier est /Users/barney/data/pets.csv
.
Chemin d'accès au fichier ou privilèges erronés
Fournir un chemin de fichier qui ne satisfait pas les critères suivants entraîne null
:
- Le fichier doit être situé sur l'hôte du serveur, vous devez spécifier le chemin d'accès complet au fichier et vous devez disposer du
FILE
privilège. - Le fichier doit être lisible par tous et il doit être inférieur à la taille, en octets, du
max_allowed_packet
variable système. - Si le
secure_file_priv
variable système est définie sur un nom de répertoire non vide, le fichier à charger doit se trouver dans ce répertoire.
Voici comment vérifier ces deux variables système :
SELECT
@@GLOBAL.secure_file_priv,
@@GLOBAL.max_allowed_packet;
Résultat :
+---------------------------+-----------------------------+ | @@GLOBAL.secure_file_priv | @@GLOBAL.max_allowed_packet | +---------------------------+-----------------------------+ | NULL | 16777216 | +---------------------------+-----------------------------+
Dans mon cas, je n'ai aucun répertoire spécifié dans le secure_file_priv
variable système et mon max_allowed_packet
la variable est définie sur sa valeur par défaut (ce qui est plus que suffisant pour le fichier que j'ai téléchargé dans l'exemple précédent).
Cependant, voici ce qui se passe lorsque j'essaie de télécharger un fichier qui n'existe pas :
SELECT LOAD_FILE('pets.csv');
Résultat :
+-----------------------+ | LOAD_FILE('pets.csv') | +-----------------------+ | NULL | +-----------------------+ 1 row in set (0.000 sec)
Dans ce cas, j'ai oublié de spécifier le chemin complet du fichier.
Noms de fichiers multi-octets
Le character_set_filesystem
La variable système est utilisée pour contrôler l'interprétation des noms de fichiers qui sont donnés sous forme de chaînes littérales. Il est utilisé pour convertir les noms de fichiers spécifiés sous forme de littéral de chaîne à partir de character_set_client
à character_set_filesystem
avant d'ouvrir le fichier.
Par défaut, character_set_filesystem
est défini sur binary
, donc aucune conversion n'a lieu.
Vous pouvez vérifier cette valeur à l'aide du code suivant :
SELECT @@GLOBAL.character_set_filesystem;
Résultat :
+-----------------------------------+ | @@GLOBAL.character_set_filesystem | +-----------------------------------+ | binary | +-----------------------------------+
Chemin de fichier nul
Fournir un null
le chemin du fichier donne null
:
SELECT LOAD_FILE(null);
Résultat :
+-----------------+ | LOAD_FILE(null) | +-----------------+ | NULL | +-----------------+ 1 row in set (0.000 sec)
Chemin de fichier manquant
Le fait de ne pas fournir de chemin d'accès au fichier entraîne une erreur :
SELECT LOAD_FILE();
Résultat :
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'LOAD_FILE'