sql >> Database >  >> RDS >> MariaDB

Hoe LOAD_FILE() werkt in MariaDB

In MariaDB, de LOAD_FILE() functie leest een bestand en retourneert de inhoud van het bestand als een tekenreeks.

Syntaxis

De syntaxis gaat als volgt:

LOAD_FILE(file_name)

Waar file_name is de volledige padnaam naar het bestand.

Voorbeeld

Stel dat we een bestand hebben met de naam pets.csv die de volgende tekst bevat:

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

We kunnen de LOAD_FILE() . gebruiken functie om die inhoud te lezen en terug te sturen:

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

Resultaat:

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

In dit geval is het volledige pad naar het bestand /Users/barney/data/pets.csv .

Verkeerd bestandspad of rechten

Het verstrekken van een bestandspad dat niet aan de volgende criteria voldoet, resulteert in null :

  • Het bestand moet zich op de serverhost bevinden, u moet de volledige padnaam naar het bestand opgeven en u moet de FILE hebben voorrecht.
  • Het bestand moet voor iedereen leesbaar zijn en het moet kleiner zijn dan de grootte, in bytes, van het max_allowed_packet systeem variabele.
  • Als de secure_file_priv systeemvariabele is ingesteld op een niet-lege mapnaam, moet het te laden bestand zich in die map bevinden.

Zo controleert u die twee systeemvariabelen:

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

Resultaat:

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

In mijn geval heb ik geen mappen gespecificeerd in de secure_file_priv systeemvariabele, en mijn max_allowed_packet variabele is standaard ingesteld (wat meer dan genoeg is voor het bestand dat ik in het vorige voorbeeld heb geüpload).

Dit is echter wat er gebeurt als ik een bestand probeer te uploaden dat niet bestaat:

SELECT LOAD_FILE('pets.csv');

Resultaat:

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

In dit geval ben ik vergeten het volledige pad naar het bestand op te geven.

Multi-Byte bestandsnamen

Het character_set_filesystem systeemvariabele wordt gebruikt om de interpretatie te regelen van bestandsnamen die als letterlijke tekenreeksen worden gegeven. Het wordt gebruikt voor het converteren van bestandsnamen die zijn opgegeven als een letterlijke tekenreeks van character_set_client naar character_set_filesystem voordat u het bestand opent.

Standaard character_set_filesystem is ingesteld op binary , dus er vindt geen conversie plaats.

U kunt deze waarde controleren met de volgende code:

SELECT @@GLOBAL.character_set_filesystem;

Resultaat:

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

Null-bestandspad

Het verstrekken van een null bestandspad resulteert in null :

SELECT LOAD_FILE(null);

Resultaat:

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

Ontbrekend bestandspad

Het niet opgeven van een bestandspad resulteert in een fout:

SELECT LOAD_FILE();

Resultaat:

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


  1. Deel 1:Beeldclassificatie met MariaDB Server en TensorFlow - een overzicht

  2. Hoe te werken met PGpoint voor geolocatie met behulp van PostgreSQL?

  3. Rails-scope - waar in exacte overeenkomsten

  4. PostgreSQL VACUUMM en ANALYSE Tips voor beste praktijken