I MariaDB er LOAD_FILE()
funktionen læser en fil og returnerer filindholdet som en streng.
Syntaks
Syntaksen ser sådan ud:
LOAD_FILE(file_name)
Hvor file_name
er det fulde stinavn til filen.
Eksempel
Antag, at vi har en fil kaldet pets.csv
der indeholder følgende tekst:
1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat"
Vi kan bruge LOAD_FILE()
funktion til at læse og returnere dette indhold:
SELECT LOAD_FILE('/Users/barney/data/pets.csv');
Resultat:
+---------------------------------------------+ | LOAD_FILE('/Users/barney/data/pets.csv') | +---------------------------------------------+ | 1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat" | +---------------------------------------------+ 1 row in set (0.186 sec)
I dette tilfælde er den fulde sti til filen /Users/barney/data/pets.csv
.
Forkert filsti eller privilegier
Angivelse af en filsti, der ikke opfylder følgende kriterier, resulterer i null
:
- Filen skal være placeret på serverværten, du skal angive det fulde stinavn til filen, og du skal have
FILE
privilegium. - Filen skal kunne læses af alle, og den skal være mindre end størrelsen i bytes af
max_allowed_packet
systemvariabel. - Hvis
secure_file_priv
systemvariablen er indstillet til et ikke-tomt biblioteksnavn, skal filen, der skal indlæses, være placeret i den mappe.
Sådan tjekker du disse to systemvariabler:
SELECT
@@GLOBAL.secure_file_priv,
@@GLOBAL.max_allowed_packet;
Resultat:
+---------------------------+-----------------------------+ | @@GLOBAL.secure_file_priv | @@GLOBAL.max_allowed_packet | +---------------------------+-----------------------------+ | NULL | 16777216 | +---------------------------+-----------------------------+
I mit tilfælde har jeg ingen mapper angivet i secure_file_priv
systemvariabel og min max_allowed_packet
variabel er sat som standard (hvilket er mere end nok til den fil, jeg uploadede i det forrige eksempel).
Men her er hvad der sker, når jeg prøver at uploade en fil, der ikke eksisterer:
SELECT LOAD_FILE('pets.csv');
Resultat:
+-----------------------+ | LOAD_FILE('pets.csv') | +-----------------------+ | NULL | +-----------------------+ 1 row in set (0.000 sec)
I dette tilfælde glemte jeg at angive den fulde sti til filen.
Multi-Byte filnavne
character_set_filesystem
systemvariabel bruges til at kontrollere fortolkning af filnavne, der er angivet som bogstavelige strenge. Det bruges til at konvertere filnavne angivet som en streng-literal fra character_set_client
til character_set_filesystem
før du åbner filen.
Som standard er character_set_filesystem
er indstillet til binary
, så ingen konvertering finder sted.
Du kan kontrollere denne værdi ved hjælp af følgende kode:
SELECT @@GLOBAL.character_set_filesystem;
Resultat:
+-----------------------------------+ | @@GLOBAL.character_set_filesystem | +-----------------------------------+ | binary | +-----------------------------------+
Nulfilsti
Angivelse af en null
filstien resulterer i null
:
SELECT LOAD_FILE(null);
Resultat:
+-----------------+ | LOAD_FILE(null) | +-----------------+ | NULL | +-----------------+ 1 row in set (0.000 sec)
Manglende filsti
Undladelse af at angive en filsti resulterer i en fejl:
SELECT LOAD_FILE();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'LOAD_FILE'