2011-11-22 27 views
9

Intento cargar el archivo en un blob de MySQL (en una Mac) pero no funciona.Load_File no funciona

Mi consulta es

INSERT INTO MyTable VALUES('7', LOAD_FILE('Dev:MonDoc.odt')) 

Con esta consulta, no aparece ningún error, pero no se ha cargado el archivo en el BLOB. ¿Qué estoy haciendo mal?

+2

Parece que a la consulta le falta un paréntesis de cierre. –

+0

Oh, sí, pero en mi consulta existe el paréntesis, pero no funciona – Flex60460

+0

privilegios de raíz? – zloctb

Respuesta

8

Los manual indica lo siguiente:

LOAD_FILE (nombre_archivo)

lee el archivo y devuelve el contenido del archivo como una cadena. Para usar esta función , el archivo debe estar ubicado en el host del servidor, debe especificar el nombre completo de la ruta del archivo, y debe tener el privilegio FILE . El archivo debe ser legible por todos y por su tamaño inferior a max_allowed_packet bytes. Si la variable de sistema secure_file_priv es configurada en un nombre de directorio no vacío, el archivo que se debe cargar debe ser ubicado en ese directorio.

Si el archivo no existe o no se puede leer porque una de las condiciones anteriores no se cumple, la función devuelve NULL.

A partir de MySQL 5.0.19, la variable del sistema character_set_filesystem controla la interpretación de los nombres de archivo que se dan como cadenas literales.

mysql> UPDATE t 
      SET blob_col=LOAD_FILE('/tmp/picture') 
      WHERE id=1; 

partir de esto, veo más de una cosa que podría estar equivocado en su caso ...

  • ¿Está eliminando la ruta completa?
  • son privilegios establecidos correctamente?
  • ¿Qué devuelve la función? ¿NULO?
  • ¿Has probado con la consulta dada en el manual?
+0

Hice 2 errores. El archivo no está en mysqlserver y mi usuario no tiene privilegios de archivos. Hago que el cambio le brinde, espero, ¡buenas noticias! – Flex60460

4

tuve el mismo problema con Linux ...

select load_file('/tmp/data.blob'); 
+-----------------------------+ 
| load_file('/tmp/data.blob') | 
+-----------------------------+ 
| NULL      | 
+-----------------------------+ 

el tiempo que podría cargar el archivo con éxito después de usuario y la propiedad de grupo se cambiaron a 'mysql':

sudo chown mysql:mysql /tmp/data.blob 
+2

Me ha funcionado. ¡Gracias! (Pero ¿por qué funcionó?) Mis datos.blob tenían permisos de lectura para mi grupo y otros: -rw-rw-r--) –

+0

Creo que el usuario de la base de datos también necesita que se establezca el "privilegio de archivo" en MySQL. – rmv

+0

| Advertencia | 1301 | El resultado de load_file() fue mayor que max_allowed_packet (104 8576) - truncado | – zloctb

2

doble escapa de los slahes en el camino completo si estás en Windows.

2

Yo sólo quería añadir una advertencia más que encontré en mis pruebas:

cuando se utiliza select load_file('/path/to/theFile.txt'); El archivo que está cargando tiene que estar en la máquina de la instancia de SQL se está ejecutando en.

Esto me mordió en el trasero durante mucho tiempo porque uso MySQL workbench para cargar archivos todo el tiempo en nuestras varias instancias sql y cuando uso comandos como LOAD DATA LOCAL INFILE 'C:/path/to/theFile.csv' INTO TABLE esos fácilmente tomarían el archivo de mi disco duro local y procesarían en las tablas independientemente de dónde se estaba ejecutando la instancia de sql real. Sin embargo, el comando load_file no parece comportarse al menos para mí de la misma manera (Tal vez exista un comando local_load_file() que desconozco). MySQL parece que solo le permite buscar archivos del sistema local donde se está ejecutando la instancia de sql.

Así que si eres como yo y no puedes entender por qué load_file siempre devuelve NULL no tengas miedo ... sube los archivos a la instancia del servidor sql y luego utiliza esa ruta desde tu navegador Query y todos cuidate.

1

Gracias.

El usuario que está ejecutando mysql, necesita OWN el archivo. Mi error fue que pensé que solo necesitaba poder LEER o EJECUTAR el archivo.

+0

También verifique sus permisos mediante: "SELECT user, file_priv FROM mysql.user;" –