Cómo importar CSV en MySQL eficientemente y resolver errores comunes

目次

1. Introducción

La importación de datos en MySQL es una tarea extremadamente importante al manejar bases de datos. Al importar datos existentes de manera eficiente, se puede realizar rápidamente la migración a un nuevo sistema o la restauración desde una copia de seguridad. En este artículo, dirigido a principiantes y usuarios intermedios, explicamos de manera clara desde los conceptos básicos hasta las aplicaciones avanzadas de la importación de datos en MySQL. También presentamos ejemplos de comandos específicos, métodos de uso de herramientas y soluciones a problemas comunes, así que por favor léanlo hasta el final.

2. Pasos básicos para importar datos en MySQL

Al importar datos en MySQL, el proceso implica preparar la base de datos y las tablas, verificar el formato de los datos a importar y ejecutar el comando correspondiente. A continuación, se explican estos pasos en detalle.

Preparación de la base de datos y las tablas

Primero, se necesita la base de datos y la tabla de destino para la importación. Si la base de datos no existe, créela con el siguiente comando SQL.

CREATE DATABASE example_db;
USE example_db;
CREATE TABLE example_table (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    age INT
);

Verificación del formato de los datos a importar

Al importar datos en formato CSV, asegúrese de que el archivo de datos esté en el formato correcto. Por ejemplo, un formato común es el siguiente.

1,John Doe,30
2,Jane Smith,25
  • Delimitador: Debe estar separado por comas (,).
  • Codificación: Se recomienda guardarlo en UTF-8.

LOAD DATA INFILE comando de uso

Con el comando LOAD DATA INFILE de MySQL, se pueden importar datos CSV de manera eficiente. A continuación, se muestra su sintaxis básica.

LOAD DATA INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';
  • FIELDS TERMINATED BY: Especifica el delimitador de campos.
  • ENCLOSED BY: Especifica el carácter que encierra los valores (por ejemplo, comillas dobles).
  • LINES TERMINATED BY: Especifica el carácter de terminación de línea.

Con esto, los datos se importarán a la tabla.

3. Método de importación con GUI

Usar una herramienta GUI permite que incluso las personas no familiarizadas con la línea de comandos realicen fácilmente la tarea de importación. Aquí introducimos los métodos de uso de MySQL Workbench y phpMyAdmin.

Método de uso de MySQL Workbench

  1. Iniciar el asistente de importación de datos
    Abra MySQL Workbench y seleccione «Server» → «Data Import» desde la barra de menús.
  2. Seleccionar archivo
    Especifique el archivo a importar en «Import from Self-Contained File».
  3. Selección de la base de datos objetivo
    Seleccione la base de datos de destino en «Default Target Schema».
  4. Ejecutar
    Haga clic en «Start Import» para iniciar la importación.

Método de uso de phpMyAdmin

  1. Iniciar sesión en phpMyAdmin
    Acceda a phpMyAdmin desde el navegador e inicie sesión.
  2. Seleccionar base de datos
    Seleccione la base de datos de destino desde el menú izquierdo.
  3. Abrir la pestaña de importación
    Haga clic en la pestaña «Importar» en la parte superior.
  4. Seleccionar archivo
    Especifique el archivo CSV con el botón «Seleccionar archivo».
  5. Especificar formato
    Seleccione el formato de archivo (ej.: CSV) y la codificación.
  6. Ejecutar
    Presione el botón «Ejecutar» para completar la importación.

4. Método de importación desde la línea de comandos

Si se trabaja desde la línea de comandos sin depender de herramientas GUI, es posible realizar configuraciones más detalladas. Aquí se explica el método de importación utilizando el comando mysql y el comando source.

Importación con el comando mysql

Con el siguiente comando, puede importar el archivo SQL a la base de datos.

mysql -u root -p example_db < /path/to/example.sql
  • -u: Especifica el nombre de usuario.
  • -p: Opción que solicita la entrada de la contraseña.
  • example_db: Nombre de la base de datos de destino para la importación.

Uso del comando source

Si desea realizar la importación directamente dentro del shell de MySQL, siga los pasos a continuación.

mysql -u root -p
USE example_db;
SOURCE /path/to/example.sql;

Este método es conveniente porque permite completar la operación sin salir del shell.

Consideraciones según el sistema operativo

  • Windows: Use barra invertida (\) para las rutas de archivo.
  • Linux/Mac: Use barra diagonal (/) para las rutas de archivo.

5. Precauciones al importar archivos CSV

Al importar archivos CSV en MySQL, al tener en cuenta algunos puntos de precaución de antemano, se puede avanzar en el trabajo de manera fluida. Aquí explicamos los problemas comunes durante la importación y las medidas para prevenirlos.

Problemas de codificación

Si la codificación de caracteres del archivo CSV difiere de la configuración de la base de datos, pueden ocurrir garabatos de caracteres o errores. En particular, para datos que incluyen japonés, es necesario prestar atención a las diferencias en la codificación.

  • Codificación recomendada: En MySQL, generalmente se recomienda UTF-.
  • Uso de Shift-JIS: Los archivos CSV creados en entornos Windows a menudo usan Shift-JIS, por lo que convertirlos a UTF-8 previene problemas.

Método para confirmar la codificación:

  • Windows: En el Bloc de notas, desde «Guardar como» confirmar el código de caracteres.
  • Linux/Mac: Se puede confirmar la codificación del archivo con el comando file.
file -i example.csv

Configuración de local_infile

Al usar el comando LOAD DATA INFILE, es necesario que la opción local_infile esté habilitada. Como puede estar deshabilitada por defecto en algunos casos, confirme la configuración.

Procedimiento para confirmar y habilitar la configuración:

  1. Confirmar el estado actual
   SHOW VARIABLES LIKE 'local_infile';

Si la salida es OFF, habilítela con los siguientes pasos.

  1. Habilitar al conectar el cliente
   mysql --local-infile=1 -u root -p
  1. Habilitar a nivel de servidor
  • Editar el archivo de configuración de MySQL (my.cnf o my.ini) y agregar la siguiente línea.
    [mysqld]

local_infile=1 Después de cambiar la configuración, reinicie el servidor MySQL.

Integridad de los datos CSV

Para importar los datos correctamente, confirme los siguientes puntos.

  1. Coincidencia del número de columnas
    Si el número de columnas del archivo CSV no coincide con el número de columnas de la tabla, se producirá un error. Edite el archivo CSV según sea necesario.
  2. Manejo de valores NULL
    Las celdas en blanco se tratan como NULL en MySQL. Si desea convertir NULL a un valor específico, especifique como sigue en LOAD DATA INFILE.
   LOAD DATA INFILE '/path/to/example.csv'
   INTO TABLE example_table
   FIELDS TERMINATED BY ',' 
   LINES TERMINATED BY '
'
   (id, name, age)
   SET age = IF(age='', NULL, age);
  1. Formato de fecha
    El tipo de fecha de MySQL (DATE, DATETIME) tiene como estándar el formato YYYY-MM-DD. Si se usa otro formato (ej.: MM/DD/YYYY), es necesario convertir los datos antes de la importación.

Configuración de delimitadores y caracteres de encierro

Si el delimitador (carácter separador) en el archivo CSV difiere del formato esperado por MySQL, se producirá un error.

  • Si el delimitador es tabulación
    Si el archivo CSV está delimitado por tabulaciones, especifique como sigue.
  FIELDS TERMINATED BY 'code>
  • Si los valores están encerrados en caracteres de encierro (comillas dobles)
    Especifique el carácter de encierro.
  FIELDS ENCLOSED BY '"'

6. Ejemplos prácticos de exportación e importación

La exportación e importación de datos en MySQL son procesos importantes en la migración de datos y las operaciones de respaldo. En esta sección, explicaremos métodos eficientes de exportación e importación, incluyendo ejemplos reales de comandos.

Pasos para la exportación de datos

Cuando se exportan datos de MySQL, se utiliza el comando mysqldump. Con este comando, se puede obtener fácilmente un respaldo de la base de datos o de las tablas.

Exportación de la base de datos completa

Con el siguiente comando, se puede exportar una base de datos específica.

mysqldump -u root -p example_db > example_db.sql
  • -u root: Especifica el nombre de usuario.
  • -p: Opción que solicita la contraseña.
  • example_db.sql: Nombre del archivo de destino de la exportación.

Exportación de una tabla específica

Si se desea exportar solo una tabla específica en lugar de la base de datos completa, especifíquese de la siguiente manera.

mysqldump -u root -p example_db example_table > example_table.sql

Exportación de múltiples bases de datos

Para respaldar múltiples bases de datos, se utiliza la opción --databases.

mysqldump -u root -p --databases db1 db2 > multiple_dbs.sql

Exportación de todas las bases de datos

Para respaldar todas las bases de datos en el servidor, se utiliza la opción --all-databases.

mysqldump -u root -p --all-databases > all_databases.sql

Pasos para la importación de datos

Para importar los datos exportados, se utiliza el comando mysql. A continuación, se muestran ejemplos específicos.

Importación de la base de datos completa

Para restaurar la base de datos exportada, ejecute el siguiente comando.

mysql -u root -p example_db < example_db.sql

Importación de una tabla específica

Para restaurar los datos de una tabla específica exportada, se ejecuta de manera similar.

mysql -u root -p example_db < example_table.sql

Combinación de creación de base de datos e importación

Si la base de datos de destino para la importación no existe aún, es necesario crearla previamente. Siga los siguientes pasos como referencia.

  1. Crear la base de datos:
   CREATE DATABASE example_db;
  1. Importar en la base de datos creada:
   mysql -u root -p example_db < example_db.sql

Puntos de atención en la exportación e importación

  1. Verificación del archivo de exportación
    Después de la exportación, verifique el contenido del archivo para asegurarse de que no incluya respaldos incompletos.
   less example_db.sql
  1. Coincidencia de codificación
    Asegúrese de que la codificación de caracteres coincida entre la exportación y la importación. Se utiliza UTF-8 por defecto, pero especifique la opción --default-character-set según sea necesario.
   mysqldump --default-character-set=utf8 -u root -p example_db > example_db.sql
  1. Configuración de permisos
    Al importar, asegúrese de que el usuario tenga los permisos adecuados.
   GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';

 

7. Solución de problemas

Al importar datos en MySQL, pueden ocurrir varios errores o problemas. En esta sección, se explican los problemas comunes y sus métodos de resolución.

Errores comunes y sus soluciones

ERROR 1148 (42000): The used command is not allowed with this MySQL version

  • Causa
    Ocurre cuando el comando LOAD DATA INFILE está deshabilitado. Por razones de seguridad, en muchas instalaciones de MySQL la opción local_infile está desactivada por defecto.
  • Solución
  1. Verifique la configuración actual de local_infile.
    SHOW VARIABLES LIKE 'local_infile';
  2. Actívelo al conectar el cliente.
    mysql --local-infile=1 -u root -p
  3. Modifique la configuración del servidor para habilitarlo de forma permanente.
    • Agregue lo siguiente al archivo de configuración de MySQL (my.cnf o my.ini):
      [mysqld]

Establezca local_infile=1 y reinicie el servidor MySQL.

ERROR 1366: Incorrect string value

  • Causa
    Ocurre cuando los datos que se importan no coinciden con la configuración de juego de caracteres de la base de datos. En particular, los caracteres multibyte como el japonés suelen ser la causa.
  • Solución
  1. Verifique la codificación de caracteres de la base de datos y de la tabla.
    SHOW VARIABLES LIKE 'character_set%';
  2. Unifique la codificación según sea necesario. A continuación se muestra un ejemplo para establecer UTF-8.
    ALTER TABLE example_table CONVERT TO CHARACTER SET utf8mb4;
  3. Especifique la codificación al exportar e importar.
    mysqldump --default-character-set=utf8mb4 -u root -p example_db > example_db.sql mysql --default-character-set=utf8mb4 -u root -p example_db < example_db.sql

ERROR 1062: Duplicate entry

  • Causa
    Los datos que se importan contienen entradas duplicadas que violan la clave primaria o las restricciones únicas de la tabla.
  • Solución
  1. Ignorar los datos duplicados:
    LOAD DATA INFILE '/path/to/example.csv' INTO TABLE example_table FIELDS TERMINATED BY ',' LINES TERMINATED BY ' ' IGNORE;
  2. Actualizar en caso de duplicado:
    INSERT INTO example_table (id, name, age) VALUES (1, 'John Doe', 30) ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age);

ERROR 1045: Access denied for user

  • Causa
    Faltan permisos para acceder a la base de datos de destino.
  • Solución
  1. Verifique los privilegios del usuario.
    SHOW GRANTS FOR 'user'@'localhost';
  2. Conceda los privilegios necesarios.
    GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost'; FLUSH PRIVILEGES;

Problemas y soluciones al importar datos de gran volumen

Error de insuficiencia de memoria

  • Causa
    Importar una gran cantidad de datos de una sola vez puede agotar la memoria.
  • Solución
  1. Divida los datos e impórtelos. En Linux/Mac puede usar el comando split.
    split -l 1000 large_file.csv part_
  2. Importe cada archivo parcial en orden.

Timeout del servidor

  • Causa
    La importación de grandes volúmenes de datos no se completa dentro del tiempo límite, provocando un timeout.
  • Solución
    Modifique la configuración de MySQL para ampliar el tiempo de espera.
  SET GLOBAL net_read_timeout = 600;
  SET GLOBAL net_write_timeout = 600;

8. Preguntas frecuentes (FAQ)

En relación con la importación de datos en MySQL, hemos compilado las preguntas más comunes de los lectores. Ofrecemos respuestas simples y fáciles de entender para los problemas que podrían surgir en la operación real.

Q1: ¿Es posible importar solo columnas específicas de un archivo CSV?

A: Sí, es posible. Al usar el comando LOAD DATA INFILE, se puede especificar las columnas que se desean importar.

Ejemplo:
A continuación, se muestra un ejemplo de cómo importar la primera y tercera columna del archivo CSV en las columnas id y age de example_table.

LOAD DATA INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '
'
(id, @dummy, age);

De esta manera, asignando las columnas no deseadas a un marcador de posición como @dummy, se puede importar solo columnas específicas.

Q2: ¿Cuál es el método para importar datos de gran volumen de manera eficiente?

A: Para la importación de grandes cantidades de datos, los siguientes métodos son efectivos.

  1. Desactivar los índices temporalmente
    Desactivar los índices antes de la importación y volver a crearlos después de completar la importación mejora el rendimiento.
   ALTER TABLE example_table DISABLE KEYS;
   -- Procesamiento de importación
   ALTER TABLE example_table ENABLE KEYS;
  1. Aprovechar las inserciones en masa
    El comando LOAD DATA INFILE es ideal para procesar grandes cantidades de datos. Para mejorar aún más la velocidad de importación, se puede usar la opción LOCAL para cargar archivos del lado del cliente.
   LOAD DATA LOCAL INFILE '/path/to/large_file.csv' INTO TABLE example_table;
  1. Dividir el archivo
    En Linux o Mac, usar el comando split para dividir archivos grandes y luego importarlos en unidades más pequeñas de manera secuencial también es efectivo.

Q3: ¿Hay métodos para validar los datos durante la importación?

A: Sí, hay varios métodos para validar los datos durante la importación.

  1. Usar una tabla temporal
    En lugar de importar los datos directamente a la tabla de producción, importarlos a una tabla temporal y luego verificarlos.
   CREATE TEMPORARY TABLE temp_table LIKE example_table;
   LOAD DATA INFILE '/path/to/example.csv' INTO TABLE temp_table;
   -- Migrar a la tabla de producción después de verificar los datos
   INSERT INTO example_table SELECT * FROM temp_table;
  1. Verificar la salida de errores
    Al agregar la opción ERRORS al comando LOAD DATA INFILE, se pueden obtener detalles de los errores.
   LOAD DATA INFILE '/path/to/example.csv'
   INTO TABLE example_table
   FIELDS TERMINATED BY ',' 
   LINES TERMINATED BY '
'
   IGNORE 1 LINES
   (@col1, @col2, @col3)
   SET col1 = IF(@col1='', NULL, @col1),
       col2 = @col2,
       col3 = @col3;

Q4: MySQL se quedó sin tiempo durante la importación de datos. ¿Qué debo hacer?

A: El problema de tiempo de espera puede deberse a la cantidad de datos o a la configuración del servidor. Se puede resolver con los siguientes pasos.

  1. Extender el tiempo de espera
    Ajustar la configuración de tiempo de espera de MySQL.
   SET GLOBAL net_read_timeout = 600;
   SET GLOBAL net_write_timeout = 600;
  1. Dividir el archivo e importar
    Dividir archivos grandes y luego importarlos puede prevenir los tiempos de espera.
  2. Verificar los registros de MySQL
    Para identificar la causa del tiempo de espera, revise el registro de errores.

Q5: ¿Cómo manejar celdas en blanco como NULL durante la importación?

A: Se puede procesar celdas en blanco como NULL usando la opción SET del comando LOAD DATA INFILE.

Ejemplo:
En el siguiente comando, se convierten los valores vacíos en NULL.

LOAD DATA INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '
'
(name, age)
SET age = IF(age='', NULL, age);

9. Resumen

En este artículo, hemos explicado en detalle los procedimientos, puntos clave y solución de problemas relacionados con la importación de datos en MySQL. Hemos incluido información práctica para que sea de referencia tanto para principiantes como para usuarios intermedios. A continuación, repasamos los puntos importantes tratados en este artículo.

Puntos clave del artículo

  1. Comprensión de los procedimientos básicos
  • Hemos explicado cómo importar datos de manera eficiente utilizando el comando LOAD DATA INFILE y el comando mysql.
  • También introdujimos métodos sencillos utilizando herramientas GUI (MySQL Workbench, phpMyAdmin).
  1. Puntos de atención para archivos CSV
  • Hemos cubierto puntos de atención para mantener la integridad de los datos, como la codificación (UTF-8 recomendada), coincidencia del número de columnas, manejo de valores NULL, etc.
  1. Ejemplos prácticos de exportación e importación
  • Proporcionamos procedimientos específicos desde la exportación utilizando el comando mysqldump hasta la importación.
  • Se puede aplicar a la migración de datos entre servidores o tareas de respaldo.
  1. Solución de problemas
  • Explicamos en detalle errores comunes (por ejemplo: ERROR 1148 o ERROR 1366) y sus métodos de resolución.
  • Introdujimos mejores prácticas para manejar grandes volúmenes de datos o tiempos de espera.
  1. Preguntas frecuentes (FAQ)
  • Cubrimos las dudas de los lectores, como el procesamiento de columnas específicas durante la importación, importación eficiente de grandes volúmenes de datos, métodos de verificación de datos, etc.

Recursos de referencia adicionales

Si desea aprender más en detalle, por favor consulte los siguientes recursos.

Pasos siguientes

  • Aprovechar el conocimiento adquirido
    Pruebe los procedimientos de este artículo en proyectos reales para fortalecer sus habilidades.
  • Aprender temas relacionados
    Al aprender también sobre estrategias de respaldo y configuraciones de seguridad en la gestión de bases de datos, mejorará aún más su capacidad práctica.

La importación de datos en MySQL puede parecer difícil a primera vista, pero al captar los puntos explicados en este artículo, debería poder avanzar el trabajo de manera fluida. ¡Continúe puliendo sus habilidades en la gestión de bases de datos y aspire a una operación más eficiente en el futuro!