MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

Wie LOAD_FILE() in MariaDB funktioniert

In MariaDB die LOAD_FILE() liest eine Datei und gibt den Dateiinhalt als String zurück.

Syntax

Die Syntax sieht so aus:

LOAD_FILE(file_name)

Wobei file_name ist der vollständige Pfadname zur Datei.

Beispiel

Angenommen, wir haben eine Datei namens pets.csv das den folgenden Text enthält:

1,"Wag","Dog"
2,"Bark","Dog"
3,"Meow","Cat"

Wir können das LOAD_FILE() verwenden Funktion zum Lesen und Zurückgeben dieser Inhalte:

SELECT LOAD_FILE('/Users/barney/data/pets.csv');

Ergebnis:

+---------------------------------------------+
| LOAD_FILE('/Users/barney/data/pets.csv')    |
+---------------------------------------------+
| 1,"Wag","Dog"
2,"Bark","Dog"
3,"Meow","Cat" |
+---------------------------------------------+
1 row in set (0.186 sec)

In diesem Fall lautet der vollständige Pfad zur Datei /Users/barney/data/pets.csv .

Falscher Dateipfad oder falsche Berechtigungen

Die Angabe eines Dateipfads, der die folgenden Kriterien nicht erfüllt, führt zu null :

  • Die Datei muss sich auf dem Serverhost befinden, Sie müssen den vollständigen Pfadnamen zur Datei angeben und Sie müssen die FILE haben Privileg.
  • Die Datei muss für alle lesbar sein und kleiner als die Größe des max_allowed_packet in Bytes sein Systemvariable.
  • Falls der secure_file_priv Systemvariable auf einen nicht leeren Verzeichnisnamen gesetzt ist, muss sich die zu ladende Datei in diesem Verzeichnis befinden.

So prüfen Sie diese beiden Systemvariablen:

SELECT
    @@GLOBAL.secure_file_priv,
    @@GLOBAL.max_allowed_packet;

Ergebnis:

+---------------------------+-----------------------------+
| @@GLOBAL.secure_file_priv | @@GLOBAL.max_allowed_packet |
+---------------------------+-----------------------------+
| NULL                      |                    16777216 |
+---------------------------+-----------------------------+

In meinem Fall habe ich keine Verzeichnisse in secure_file_priv angegeben Systemvariable und mein max_allowed_packet Die Variable ist auf ihren Standardwert gesetzt (was für die Datei, die ich im vorherigen Beispiel hochgeladen habe, mehr als genug ist).

Folgendes passiert jedoch, wenn ich versuche, eine Datei hochzuladen, die nicht existiert:

SELECT LOAD_FILE('pets.csv');

Ergebnis:

+-----------------------+
| LOAD_FILE('pets.csv') |
+-----------------------+
| NULL                  |
+-----------------------+
1 row in set (0.000 sec)

In diesem Fall habe ich vergessen, den vollständigen Pfad zur Datei anzugeben.

Multibyte-Dateinamen

Das character_set_filesystem Die Systemvariable wird verwendet, um die Interpretation von Dateinamen zu steuern, die als wörtliche Zeichenfolgen angegeben werden. Es wird zum Konvertieren von Dateinamen verwendet, die als String-Literal von character_set_client angegeben sind zu character_set_filesystem bevor Sie die Datei öffnen.

Standardmäßig character_set_filesystem auf binary gesetzt ist , sodass keine Konvertierung stattfindet.

Sie können diesen Wert mit dem folgenden Code überprüfen:

SELECT @@GLOBAL.character_set_filesystem;

Ergebnis:

+-----------------------------------+
| @@GLOBAL.character_set_filesystem |
+-----------------------------------+
| binary                            |
+-----------------------------------+

Kein Dateipfad

Bereitstellen eines null Dateipfad ergibt null :

SELECT LOAD_FILE(null);

Ergebnis:

+-----------------+
| LOAD_FILE(null) |
+-----------------+
| NULL            |
+-----------------+
1 row in set (0.000 sec)

Fehlender Dateipfad

Wenn Sie keinen Dateipfad angeben, wird ein Fehler ausgegeben:

SELECT LOAD_FILE();

Ergebnis:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'LOAD_FILE'