V MariaDB, LOAD_FILE()
funkce přečte soubor a vrátí obsah souboru jako řetězec.
Syntaxe
Syntaxe vypadá takto:
LOAD_FILE(file_name)
Kde file_name
je úplný název cesty k souboru.
Příklad
Předpokládejme, že máme soubor s názvem pets.csv
který obsahuje následující text:
1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat"
Můžeme použít LOAD_FILE()
funkce pro čtení a vrácení tohoto obsahu:
SELECT LOAD_FILE('/Users/barney/data/pets.csv');
Výsledek:
+---------------------------------------------+ | LOAD_FILE('/Users/barney/data/pets.csv') | +---------------------------------------------+ | 1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat" | +---------------------------------------------+ 1 row in set (0.186 sec)
V tomto případě je úplná cesta k souboru /Users/barney/data/pets.csv
.
Špatná cesta k souboru nebo oprávnění
Zadáním cesty k souboru, která nesplňuje následující kritéria, bude null
:
- Soubor musí být umístěn na hostitelském serveru, musíte zadat úplnou cestu k souboru a musíte mít
FILE
privilegium. - Soubor musí být čitelný pro všechny a musí být menší než velikost v bajtech
max_allowed_packet
systémová proměnná. - Pokud
secure_file_priv
je systémová proměnná nastavena na neprázdný název adresáře, soubor, který se má načíst, musí být umístěn v tomto adresáři.
Zde je návod, jak zkontrolovat tyto dvě systémové proměnné:
SELECT
@@GLOBAL.secure_file_priv,
@@GLOBAL.max_allowed_packet;
Výsledek:
+---------------------------+-----------------------------+ | @@GLOBAL.secure_file_priv | @@GLOBAL.max_allowed_packet | +---------------------------+-----------------------------+ | NULL | 16777216 | +---------------------------+-----------------------------+
V mém případě nemám žádné adresáře specifikované v secure_file_priv
systémová proměnná a můj max_allowed_packet
proměnná je nastavena na výchozí hodnotu (což je více než dostatečné pro soubor, který jsem nahrál v předchozím příkladu).
Když se však pokusím nahrát soubor, který neexistuje, stane se toto:
SELECT LOAD_FILE('pets.csv');
Výsledek:
+-----------------------+ | LOAD_FILE('pets.csv') | +-----------------------+ | NULL | +-----------------------+ 1 row in set (0.000 sec)
V tomto případě jsem zapomněl zadat úplnou cestu k souboru.
Vícebajtové názvy souborů
character_set_filesystem
systémová proměnná se používá k řízení interpretace názvů souborů, které jsou uvedeny jako doslovné řetězce. Používá se pro převod názvů souborů zadaných jako řetězcový literál z character_set_client
na character_set_filesystem
před otevřením souboru.
Ve výchozím nastavení character_set_filesystem
je nastaven na binary
, takže neproběhne žádná konverze.
Tuto hodnotu můžete zkontrolovat pomocí následujícího kódu:
SELECT @@GLOBAL.character_set_filesystem;
Výsledek:
+-----------------------------------+ | @@GLOBAL.character_set_filesystem | +-----------------------------------+ | binary | +-----------------------------------+
Cesta k souboru nula
Poskytnutí null
cesta k souboru má za následek null
:
SELECT LOAD_FILE(null);
Výsledek:
+-----------------+ | LOAD_FILE(null) | +-----------------+ | NULL | +-----------------+ 1 row in set (0.000 sec)
Chybí cesta k souboru
Pokud nezadáte cestu k souboru, dojde k chybě:
SELECT LOAD_FILE();
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'LOAD_FILE'