MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Comment LOAD_FILE() fonctionne dans MariaDB

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)

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'