sql >> Databasteknik >  >> RDS >> MariaDB

Hur LOAD_FILE() fungerar i MariaDB

I MariaDB, LOAD_FILE() funktionen läser en fil och returnerar filinnehållet som en sträng.

Syntax

Syntaxen ser ut så här:

LOAD_FILE(file_name)

Där file_name är det fullständiga sökvägsnamnet till filen.

Exempel

Anta att vi har en fil som heter pets.csv som innehåller följande text:

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

Vi kan använda LOAD_FILE() funktion för att läsa och returnera detta innehåll:

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

Resultat:

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

I det här fallet är den fullständiga sökvägen till filen /Users/barney/data/pets.csv .

Fel sökväg eller behörigheter

Att tillhandahålla en filsökväg som inte uppfyller följande kriterier resulterar i null :

  • Filen måste finnas på servervärden, du måste ange hela sökvägsnamnet till filen och du måste ha FILE privilegium.
  • Filen måste vara läsbar av alla och den måste vara mindre än storleken, i byte, av max_allowed_packet systemvariabel.
  • Om secure_file_priv systemvariabeln är inställd på ett icke-tomt katalognamn, filen som ska laddas måste finnas i den katalogen.

Så här kontrollerar du dessa två systemvariabler:

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

Resultat:

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

I mitt fall har jag inga kataloger specificerade i secure_file_priv systemvariabel och mitt max_allowed_packet variabeln är inställd som standard (vilket är mer än tillräckligt för filen jag laddade upp i föregående exempel).

Men det här är vad som händer när jag försöker ladda upp en fil som inte finns:

SELECT LOAD_FILE('pets.csv');

Resultat:

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

I det här fallet glömde jag att ange hela sökvägen till filen.

Multi-Byte filnamn

character_set_filesystem systemvariabel används för att styra tolkningen av filnamn som ges som bokstavliga strängar. Den används för att konvertera filnamn som anges som en strängliteral från character_set_client till character_set_filesystem innan du öppnar filen.

Som standard är character_set_filesystem är inställd på binary , så ingen konvertering sker.

Du kan kontrollera detta värde med hjälp av följande kod:

SELECT @@GLOBAL.character_set_filesystem;

Resultat:

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

Nullfilsökväg

Ange en null filsökväg resulterar i null :

SELECT LOAD_FILE(null);

Resultat:

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

Filsökväg saknas

Att inte ange en sökväg resulterar i ett fel:

SELECT LOAD_FILE();

Resultat:

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


  1. Vad är SQL Injection?

  2. Ta reda på datatypen för kolumnerna som returneras i en resultatuppsättning i SQL Server

  3. Så här återställer du identitetskolumnvärde i SQL Server-tabell - SQL Server / T-SQL självstudie del 43

  4. hur man återställer standby-databas från en saknad arkivlogg