W MariaDB funkcja LOAD_FILE()
funkcja odczytuje plik i zwraca zawartość pliku jako ciąg.
Składnia
Składnia wygląda tak:
LOAD_FILE(file_name)
Gdzie file_name
to pełna ścieżka do pliku.
Przykład
Załóżmy, że mamy plik o nazwie pets.csv
który zawiera następujący tekst:
1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat"
Możemy użyć LOAD_FILE()
funkcja odczytywania i zwracania tych treści:
SELECT LOAD_FILE('/Users/barney/data/pets.csv');
Wynik:
+---------------------------------------------+ | LOAD_FILE('/Users/barney/data/pets.csv') | +---------------------------------------------+ | 1,"Wag","Dog" 2,"Bark","Dog" 3,"Meow","Cat" | +---------------------------------------------+ 1 row in set (0.186 sec)
W tym przypadku pełna ścieżka do pliku to /Users/barney/data/pets.csv
.
Niewłaściwa ścieżka do pliku lub uprawnienia
Dostarczenie ścieżki do pliku, która nie spełnia poniższych kryteriów, daje w wyniku null
:
- Plik musi znajdować się na hoście serwera, musisz określić pełną ścieżkę do pliku i musisz mieć
FILE
przywilej. - Plik musi być czytelny dla wszystkich i musi być mniejszy niż rozmiar w bajtach
max_allowed_packet
zmienna systemowa. - Jeśli
secure_file_priv
zmienna systemowa jest ustawiona na niepustą nazwę katalogu, plik do załadowania musi znajdować się w tym katalogu.
Oto jak sprawdzić te dwie zmienne systemowe:
SELECT
@@GLOBAL.secure_file_priv,
@@GLOBAL.max_allowed_packet;
Wynik:
+---------------------------+-----------------------------+ | @@GLOBAL.secure_file_priv | @@GLOBAL.max_allowed_packet | +---------------------------+-----------------------------+ | NULL | 16777216 | +---------------------------+-----------------------------+
W moim przypadku nie mam żadnych katalogów określonych w secure_file_priv
zmienna systemowa i mój max_allowed_packet
zmienna jest ustawiona domyślnie (co jest więcej niż wystarczające dla pliku, który przesłałem w poprzednim przykładzie).
Oto jednak, co się dzieje, gdy próbuję przesłać plik, który nie istnieje:
SELECT LOAD_FILE('pets.csv');
Wynik:
+-----------------------+ | LOAD_FILE('pets.csv') | +-----------------------+ | NULL | +-----------------------+ 1 row in set (0.000 sec)
W tym przypadku zapomniałem podać pełną ścieżkę do pliku.
Wielobajtowe nazwy plików
character_set_filesystem
zmienna systemowa służy do kontrolowania interpretacji nazw plików, które są podawane jako łańcuchy literowe. Służy do konwertowania nazw plików określonych jako literał ciągu z character_set_client
do character_set_filesystem
przed otwarciem pliku.
Domyślnie character_set_filesystem
jest ustawiony na binary
, więc nie następuje konwersja.
Możesz sprawdzić tę wartość za pomocą następującego kodu:
SELECT @@GLOBAL.character_set_filesystem;
Wynik:
+-----------------------------------+ | @@GLOBAL.character_set_filesystem | +-----------------------------------+ | binary | +-----------------------------------+
Zerowa ścieżka do pliku
Zapewnienie null
ścieżka pliku daje w wyniku null
:
SELECT LOAD_FILE(null);
Wynik:
+-----------------+ | LOAD_FILE(null) | +-----------------+ | NULL | +-----------------+ 1 row in set (0.000 sec)
Brak ścieżki do pliku
Niepodanie ścieżki do pliku skutkuje błędem:
SELECT LOAD_FILE();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'LOAD_FILE'