sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona LOAD_FILE() en MariaDB

En MariaDB, el LOAD_FILE() La función lee un archivo y devuelve el contenido del archivo como una cadena.

Sintaxis

La sintaxis es así:

LOAD_FILE(file_name)

Donde file_name es el nombre completo de la ruta al archivo.

Ejemplo

Supongamos que tenemos un archivo llamado pets.csv que contiene el siguiente texto:

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

Podemos usar el LOAD_FILE() función para leer y devolver esos contenidos:

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

Resultado:

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

En este caso, la ruta completa al archivo es /Users/barney/data/pets.csv .

Ruta de archivo o privilegios incorrectos

Proporcionar una ruta de archivo que no satisfaga los siguientes criterios da como resultado null :

  • El archivo debe estar ubicado en el host del servidor, debe especificar el nombre completo de la ruta al archivo y debe tener el FILE privilegio.
  • El archivo debe ser legible para todos y debe tener un tamaño menor que el tamaño, en bytes, del max_allowed_packet variable del sistema.
  • Si secure_file_priv variable del sistema se establece en un nombre de directorio no vacío, el archivo que se va a cargar debe estar ubicado en ese directorio.

Así es como se verifican esas dos variables del sistema:

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

Resultado:

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

En mi caso, no tengo ningún directorio especificado en secure_file_priv variable del sistema y mi max_allowed_packet la variable está establecida en su valor predeterminado (que es más que suficiente para el archivo que cargué en el ejemplo anterior).

Sin embargo, esto es lo que sucede cuando intento cargar un archivo que no existe:

SELECT LOAD_FILE('pets.csv');

Resultado:

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

En este caso, olvidé especificar la ruta completa al archivo.

Nombres de archivos de varios bytes

El character_set_filesystem La variable del sistema se utiliza para controlar la interpretación de los nombres de archivo que se dan como cadenas literales. Se usa para convertir nombres de archivo especificados como una cadena literal de character_set_client a character_set_filesystem antes de abrir el archivo.

Por defecto, character_set_filesystem se establece en binary , por lo que no se produce ninguna conversión.

Puede verificar este valor usando el siguiente código:

SELECT @@GLOBAL.character_set_filesystem;

Resultado:

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

Ruta de archivo nula

Proporcionar un null la ruta del archivo da como resultado null :

SELECT LOAD_FILE(null);

Resultado:

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

Ruta de archivo faltante

Si no proporciona una ruta de archivo, se produce un error:

SELECT LOAD_FILE();

Resultado:

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