MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como LOAD_FILE() funciona no MariaDB


No MariaDB, o LOAD_FILE() A função lê um arquivo e retorna o conteúdo do arquivo como uma string.

Sintaxe


A sintaxe fica assim:
LOAD_FILE(file_name)

Onde file_name é o nome completo do caminho para o arquivo.

Exemplo


Suponha que temos um arquivo chamado pets.csv que contém o seguinte texto:
1,"Wag","Dog"
2,"Bark","Dog"
3,"Meow","Cat"

Podemos usar o LOAD_FILE() função para ler e retornar esses conteúdos:
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)

Neste caso, o caminho completo para o arquivo é /Users/barney/data/pets.csv .

Caminho de arquivo ou privilégios incorretos


Fornecer um caminho de arquivo que não atende aos critérios a seguir resulta em null :
  • O arquivo deve estar localizado no host do servidor, você deve especificar o nome completo do caminho para o arquivo e deve ter o FILE privilégio.
  • O arquivo deve ser legível por todos e deve ser menor que o tamanho, em bytes, do max_allowed_packet variável do sistema.
  • Se o secure_file_priv variável do sistema estiver definida para um nome de diretório não vazio, o arquivo a ser carregado deve estar localizado nesse diretório.

Veja como verificar essas duas variáveis ​​do sistema:
SELECT
    @@GLOBAL.secure_file_priv,
    @@GLOBAL.max_allowed_packet;

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

No meu caso, não tenho nenhum diretório especificado no secure_file_priv variável de sistema e meu max_allowed_packet variável está definida em seu padrão (o que é mais que suficiente para o arquivo que carreguei no exemplo anterior).

No entanto, eis o que acontece quando tento fazer upload de um arquivo que não existe:
SELECT LOAD_FILE('pets.csv');

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

Nesse caso, esqueci de especificar o caminho completo para o arquivo.

Nomes de arquivos de vários bytes


O character_set_filesystem variável de sistema é usada para controlar a interpretação de nomes de arquivos que são fornecidos como strings literais. É usado para converter nomes de arquivos especificados como uma string literal de character_set_client para character_set_filesystem antes de abrir o arquivo.

Por padrão, character_set_filesystem está definido como binary , portanto, nenhuma conversão ocorre.

Você pode verificar esse valor usando o seguinte código:
SELECT @@GLOBAL.character_set_filesystem;

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

Caminho do arquivo nulo


Fornecendo um null o caminho do arquivo resulta em null :
SELECT LOAD_FILE(null);

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

Caminho do arquivo ausente


A falha em fornecer um caminho de arquivo resulta em um erro:
SELECT LOAD_FILE();

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