Los archivos de valores separados por comas (CSV) son una forma de transferir datos entre aplicaciones. Las bases de datos como MySQL y el software de hojas de cálculo como Excel admiten la importación y exportación a través de CSV, por lo que puede usar archivos CSV para intercambiar datos entre los dos.
Los archivos CSV son texto sin formato, por lo que son naturalmente ligeros y fáciles de exportar desde MySQL.
Desde el servidor de bases de datos
Si tienes acceso al servidor en el que se ejecuta MySQL, puedes exportar una selección con el comando INTO OUTFILE
.
SELECT id, column1, column2 FROM table INTO OUTFILE '/tmp/mysqlfiles/table.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY 'n'
Esto generará un archivo CSV para /tmp/mysqlfiles/table.csv
, o donde lo hayas configurado. Deberás asegurarte de que el usuario ejecute MySQL (generalmente mysql
o root
) tiene propiedad y acceso de escritura al directorio.
También deberás asegurarte de que secure_file_priv
la configuración permite que MySQL acceda a ese directorio. Esto, por defecto, bloquea el acceso de lectura y escritura de las consultas SQL. Ésto es una buena opción; Si tu código es vulnerable a la inyección de SQL, cualquier atacante potencial solo tendría acceso a MySQL, y no al resto del sistema de archivos.
Puedes incluir en la lista blanca directorios específicos editando su archivo de configuración MySQL (generalmente ubicado en /etc/my.cnf
) para incluir:
[mysqld] secure-file-priv = "/tmp/mysqlfiles"
Lo que permitirá a MySQL leer y escribir en /tmp/mysqlfiles/
(que tendrás que crear con mkdir
) Una vez que MySQL pueda exportar archivos, debería poder ejecutar la consulta y generar archivos CSV.
Con el ENCLOSED BY
configuración, las comas se escaparán correctamente, por ejemplo:
"3","Escape, this","also, this"
Que puede tomar e importar directamente en cualquier programa de hoja de cálculo u otro software.
Ten en cuenta que el archivo CSV exportado no incluye encabezados de columna, pero las columnas estarán en el mismo orden que el SELECT
declaración. Además, los valores nulos se exportarán como N
, que es el comportamiento esperado, pero si desea cambiar esto, puede modificar la selección ajustando ifnull(field, "")
alrededor de sus campos en su SELECT
declaración.
Desde la línea de comando MySQL
Si solo tienes acceso de línea de comandos a la instancia de MySQL, y no tienes acceso al servidor en sí (como cuando no lo administras tu mismo, en el caso de Amazon RDS), el problema es un poco más complicado. Si bien puedes usar FIELDS TERMINATED BY ','
en el servidor para generar una lista separada por comas, la CLI de MySQL se separará con pestañas de forma predeterminada.
Simplemente ingresa una consulta desde la línea de comando y canalízala a un archivo:
mysql -u root -e "select * from database;" > output.tsv
Debido a que la salida de MySQL está separada con pestañas, esto se llama un archivo TSV, para «valores separados por pestañas», y puede funcionar en lugar de su archivo CSV en algunos programas, como las importaciones de hojas de cálculo. Pero no es un archivo CSV, y convertirlo a uno es complicado.
Simplemente podrías reemplazar cada pestaña con una coma, lo que funcionaría pero provocaría que fallara si hay comas en los datos de entrada. Si estás completamente seguro al 100% de que no hay comas en tu archivo TSV (consulte con grep
), puede reemplazar las pestañas con sed
:
sed "s/t/,/g" output.tsv > output.csv
Pero si tienes comas en tus datos, tendrás que usar un mucho mas largo regex:
sed "s/'/'/;s/t/","/g;s/^/"/;s/$/"/;s/n//g" output.tsv > output.csv
Esto escapará correctamente de los campos con comillas, lo que resolverá el problema de la coma.
Nota: el caracter de tabulación t
es no estándar. En macOS y BSD, no está disponible, lo que conduce a un desorden de cada «t» minúscula que causa sed
para insertar comas erróneas. Para resolver esto, deberás usar un carácter de tabulación literal en lugar de t
:
sed "s/ /,/g" output.tsv > output.csv
Si tus datos de entrada contienen pestañas, no tiene suerte y tendrá que generar un archivo CSV tu mismo con un lenguaje de secuencias de comandos.
Hazlo manualmente con un lenguaje de programación real
MySQL (y la mayoría de las bases de datos) están diseñadas para interactuar, por lo que es probable que ya tenga algún tipo de lenguaje de programación conectado a MySQL. La mayoría de los idiomas también pueden escribir en el disco, por lo que puede crear sus propios scripts de salida CSV leyendo los campos de la base de datos directamente, escapándolos correctamente y escribiendo un archivo delimitado por comas.