sql >> Databáze >  >> RDS >> MariaDB

Jak funguje LOAD_FILE() v MariaDB

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'


  1. Přidejte Ordinal Indicator k datu v Oracle

  2. Vraťte seskupený seznam s výskyty pomocí Rails a PostgreSQL

  3. Jak načíst binární obraz z databáze pomocí C# v ASP.NET

  4. Jak provádět změny schématu v MySQL a MariaDB bezpečným způsobem