MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona LOAD_FILE() in MariaDB

In MariaDB, il LOAD_FILE() la funzione legge un file e restituisce il contenuto del file come stringa.

Sintassi

La sintassi è questa:

LOAD_FILE(file_name)

Dove file_name è il percorso completo del file.

Esempio

Supponiamo di avere un file chiamato pets.csv che contiene il seguente testo:

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

Possiamo usare il LOAD_FILE() funzione per leggere e restituire quei contenuti:

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

Risultato:

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

In questo caso, il percorso completo del file è /Users/barney/data/pets.csv .

Percorso file o privilegi errati

Fornire un percorso file che non soddisfa i seguenti criteri restituisce null :

  • Il file deve trovarsi sull'host del server, devi specificare il percorso completo del file e devi avere il FILE privilegio.
  • Il file deve essere leggibile da tutti e deve essere inferiore alla dimensione, in byte, del max_allowed_packet variabile di sistema.
  • Se il secure_file_priv la variabile di sistema è impostata su un nome di directory non vuoto, il file da caricare deve trovarsi in quella directory.

Ecco come controllare queste due variabili di sistema:

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

Risultato:

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

Nel mio caso, non ho alcuna directory specificata in secure_file_priv variabile di sistema e il mio max_allowed_packet la variabile è impostata sul valore predefinito (che è più che sufficiente per il file che ho caricato nell'esempio precedente).

Tuttavia, ecco cosa succede quando provo a caricare un file che non esiste:

SELECT LOAD_FILE('pets.csv');

Risultato:

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

In questo caso, ho dimenticato di specificare il percorso completo del file.

Nomi file multibyte

Il character_set_filesystem La variabile di sistema viene utilizzata per controllare l'interpretazione dei nomi di file forniti come stringhe letterali. Viene utilizzato per convertire i nomi di file specificati come una stringa letterale da character_set_client a character_set_filesystem prima di aprire il file.

Per impostazione predefinita, character_set_filesystem è impostato su binary , quindi non avviene alcuna conversione.

Puoi controllare questo valore usando il seguente codice:

SELECT @@GLOBAL.character_set_filesystem;

Risultato:

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

Percorso file nullo

Fornire un null il percorso del file risulta null :

SELECT LOAD_FILE(null);

Risultato:

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

Percorso file mancante

Se non viene fornito un percorso di file, viene visualizzato un errore:

SELECT LOAD_FILE();

Risultato:

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