คู่มือการนำเข้า MySQL: นำเข้าไฟล์ SQL Dump และ CSV อย่างเร็ว (LOAD DATA, Workbench, phpMyAdmin)

目次

1. สิ่งที่คุณจะทำได้ในบทความนี้

หลายคนที่ค้นหา “การนำเข้าข้อมูล MySQL” อยู่ในสถานการณ์ที่ต้องการ:

  • “กู้คืนไฟล์ .sql”
  • “นำเข้า CSV”
  • “มันหยุดด้วยข้อผิดพลาด”
  • “มันไม่ทำงานใน Workbench หรือ phpMyAdmin”

กล่าวคือ คุณต้องการ วิธีแก้ที่คุณสามารถใช้ได้ทันที.

ก่อนอื่น นี่คือ “เส้นทางสู่ความสำเร็จ” ที่สั้นที่สุดตามเป้าหมาย.

🔹 คำสั่งที่เร็วที่สุดในการนำเข้าไฟล์ SQL (.sql)

สำหรับการกู้คืนสำรองหรือการย้ายเซิร์ฟเวอร์ นี่เป็นวิธีที่เร็วที่สุด.

mysql -u username -p database_name < backup.sql

สิ่งที่ควรตรวจสอบล่วงหน้า

  • ฐานข้อมูลปลายทางมีอยู่หรือไม่?
  • ผู้ใช้ที่เชื่อมต่อมีสิทธิ์สำหรับฐานข้อมูลเป้าหมายหรือไม่?
  • การเข้ารหัสไฟล์ SQL (โดยทั่วไปคือ UTF-8)

หากฐานข้อมูลยังไม่ได้สร้าง:

CREATE DATABASE example_db;

🔹 วิธีที่เร็วที่สุดในการนำเข้าไฟล์ CSV (แนะนำ)

สำหรับการนำเข้าข้อมูลขนาดใหญ่อย่างรวดเร็ว LOAD DATA เป็นตัวเลือกที่เหมาะสม.

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, name, @age)
SET age = NULLIF(@age,'');

จุดสำคัญ

  • จบบรรทัดแบบ Windows → '\r\n'
  • หากมีแถวหัวตาราง → IGNORE 1 LINES
  • แปลงสตริงว่างเป็น NULL → NULLIF()
  • หลายสภาพแวดล้อมต้องการ LOCAL (อธิบายต่อไป)

🔹 หากคุณต้องการนำเข้าผ่าน GUI

MySQL Workbench

  • Server → Data Import → เลือกไฟล์ → เรียกใช้

phpMyAdmin

  • เลือกฐานข้อมูลเป้าหมาย → Import → เลือกไฟล์ → เรียกใช้

⚠ อย่างไรก็ตาม สำหรับไฟล์ขนาดใหญ่และการจัดการข้อผิดพลาดที่เชื่อถือได้ CLI (บรรทัดคำสั่ง) มีความน่าเชื่อถือมากกว่า.

🔹 3 รายการที่ต้องตรวจสอบก่อนการนำเข้า

1. ชุดอักขระ (สำคัญที่สุด)

SHOW VARIABLES LIKE 'character_set%';

แนะนำ: utf8mb4

2. การตั้งค่าที่ทำให้เกิดข้อผิดพลาดเกี่ยวกับ INFILE

SHOW VARIABLES LIKE 'local_infile';
SHOW VARIABLES LIKE 'secure_file_priv';

3. ตรวจสอบสิทธิ์

SHOW GRANTS FOR 'user'@'localhost';

✔ สิ่งต่อไปในบทความนี้

  • วิธีละเอียดในการนำเข้าไฟล์ SQL
  • เทคนิคการนำเข้า CSV อย่างเป็นจริง
  • การวิเคราะห์อย่างครบถ้วนว่าทำไม INFILE ถึงล้มเหลว
  • การแก้ไขที่เร็วที่สุดตามประเภทข้อผิดพลาด
  • เทคนิคจากโลกจริงสำหรับชุดข้อมูลขนาดใหญ่

MySQL data import workflow diagram showing SQL file, CSV file, LOAD DATA LOCAL INFILE, mysql command, and MySQL server process

2. ประเภทของการนำเข้า MySQL และเมื่อควรใช้แต่ละแบบ

มีหลายวิธีในการนำเข้า MySQL แต่ ทางเลือกที่ดีที่สุดขึ้นอยู่กับกรณีการใช้งานของคุณ.
หากคุณเข้าใจอย่างถูกต้อง คุณจะหลีกเลี่ยงปัญหาที่ไม่จำเป็นได้.

2.1 เมื่อควรนำเข้า SQL dump (.sql)

กรณีการใช้งานทั่วไป

  • กู้คืนจากการสำรองข้อมูล
  • การย้ายเซิร์ฟเวอร์
  • นำข้อมูลแบบ production ไปใช้ในสภาพแวดล้อมการพัฒนา
  • นำเข้าข้อมูลที่ส่งออกด้วย mysqldump อีกครั้ง

คุณสมบัติ

  • กู้คืนโครงสร้างตารางทั้งหมด + ข้อมูล
  • ความสามารถในการทำซ้ำสูง
  • สามารถรวมธุรกรรมได้
  • โดยทั่วไปเป็นตัวเลือกที่ปลอดภัยที่สุด

วิธีการทั่วไป

mysql -u user -p dbname < dump.sql

หรือภายใน MySQL:

SOURCE /path/to/dump.sql;

เหมาะสำหรับ

  • การกู้คืนเต็มของฐานข้อมูลที่มีอยู่
  • การสร้างสภาพแวดล้อม production ใหม่
  • การโหลดข้อมูลสำหรับสภาพแวดล้อม CI/CD

2.2 เมื่อควรนำเข้า CSV / TSV

กรณีการใช้งานทั่วไป

  • รับข้อมูลจากระบบภายนอก
  • นำเข้าข้อมูลจาก Excel
  • การประมวลผล ETL
  • อัปเดตเฉพาะตารางที่ต้องการ

คุณสมบัติ

  • โหลดเฉพาะข้อมูล (สคีมาจะต้องมีอยู่แยกต่างหาก)
  • เร็ว ( LOAD DATA เร็วมาก)
  • อนุญาตให้ใช้ตรรกะการแปลงระหว่างการนำเข้า

วิธีการทั่วไป

LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

เหมาะสำหรับ

  • งานแบตช์ที่กำหนดเวลา
  • การบูรณาการข้อมูล
  • การรับข้อมูลจำนวนแถวมากด้วยความเร็วสูง

2.3 เมื่อควรใช้เครื่องมือ GUI

เครื่องมือทั่วไป:

  • MySQL Workbench
  • phpMyAdmin

คุณสมบัติ

  • การทำงานที่เข้าใจง่าย
  • เหมาะสำหรับผู้เริ่มต้น
  • เหมาะกับชุดข้อมูลขนาดเล็ก

คำเตือน

  • ขีดจำกัดการอัปโหลด (phpMyAdmin)
  • การหมดเวลา
  • ไม่เสถียรกับข้อมูลขนาดใหญ่
  • ยากต่อการวิเคราะห์ข้อผิดพลาด

2.4 การเปรียบเทียบตามวิธีการ (มุมมองปฏิบัติ)

MethodSpeedStabilityLarge-file supportError analysisRecommendation
mysql command★★★★★
LOAD DATA★★★★★
Workbench★★★
phpMyAdmin×★★

✔ ตัวเลือกที่แนะนำในงานจริง

  • การสำรองข้อมูลและคืนค่า → คำสั่ง mysql
  • การนำเข้าข้อมูล CSV ความเร็วสูง → LOAD DATA LOCAL INFILE
  • งานเล็กๆ ชั่วคราว → GUI

หากคุณไม่แน่ใจ การเลือก CLI (command line) คือตัวเลือกที่เสถียรที่สุด

3. การนำเข้าไฟล์ SQL (เส้นทางสู่ความสำเร็จที่เร็วที่สุด)

การนำเข้าไฟล์ .sql คือ วิธีที่พบบ่อยที่สุดสำหรับการคืนค่าจากการสำรองข้อมูลและการย้ายเซิร์ฟเวอร์.
ที่นี่ เป้าหมายคือ “ประสบความสำเร็จให้เร็วที่สุด” ดังนั้นเราจะมุ่งเน้นเฉพาะขั้นตอนปฏิบัติที่ใช้ในงานจริง。

3.1 คืนค่าในบรรทัดเดียว (วิธีที่พบบ่อยที่สุด)

นี่คือวิธีที่เชื่อถือได้และเร็วที่สุด。

mysql -u username -p database_name < backup.sql

หลังจากรันแล้ว คุณจะถูกถามรหัสผ่าน。

✔ การตรวจสอบล่วงหน้า (เพื่อป้องกันความล้มเหลว)

① ฐานข้อมูลมีอยู่หรือไม่?
SHOW DATABASES;

หากไม่มี:

CREATE DATABASE example_db;
② ผู้ใช้มีสิทธิ์หรือไม่?
SHOW GRANTS FOR 'user'@'localhost';

หากขาดสิทธิ์:

GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
③ การเข้ารหัสไฟล์

โดยปกติคือ UTF-8.
หากเห็นตัวอักษรเพี้ยน ให้ระบุอย่างชัดเจน.

mysql --default-character-set=utf8mb4 -u user -p dbname < backup.sql

3.2 รันจากภายใน MySQL (คำสั่ง SOURCE)

วิธีนี้รันหลังจากเข้าสู่ระบบ MySQL แล้ว.

mysql -u user -p
USE example_db;
SOURCE /path/to/backup.sql;

เมื่อใดที่เป็นประโยชน์

  • เมื่อต้องการรันเฉพาะส่วนของไฟล์ SQL
  • เมื่อต้องการระบุตำแหน่งข้อผิดพลาดที่แน่นอน
  • เมื่อต้องการยืนยันล็อกการรันด้วยตาเห็น

3.3 ความล้มเหลวทั่วไปและวิธีแก้ไข

❌ ERROR 1049: Unknown database

→ ฐานข้อมูลไม่มีอยู่
→ รัน CREATE DATABASE

❌ ERROR 1045: Access denied

→ สิทธิ์ไม่เพียงพอ
→ ตรวจสอบด้วย SHOW GRANTS

❌ หยุดกลางคัน / ตำแหน่งข้อผิดพลาดไม่ชัดเจน

วิธีแก้ไข:

  1. ตรวจสอบจุดเริ่มต้นและจุดสิ้นสุดของไฟล์
    head backup.sql
    tail backup.sql
    
  1. ตรวจสอบบรรทัดก่อนหน้าข้อผิดพลาด
  2. หากไฟล์ใหญ่ ให้แยกและรันเป็นส่วนๆ
    split -l 10000 backup.sql part_
    

3.4 เคล็ดลับเพื่อความเสถียรในการนำเข้า SQL ขนาดใหญ่

① ตรวจสอบการตั้งค่าธุรกรรม

ดูว่ามี SET autocommit=0; รวมอยู่หรือไม่

② หากข้อจำกัด foreign key เป็นปัญหา

SET FOREIGN_KEY_CHECKS=0;
-- import
SET FOREIGN_KEY_CHECKS=1;

③ ตรวจสอบ SQL mode

SELECT @@sql_mode;

โหมดเข้มงวดอาจส่งผลต่อการนำเข้า.

✔ คำแนะนำปฏิบัติ

  • การคืนค่าการผลิต → คำสั่ง mysql
  • การดีบัก → SOURCE
  • ไฟล์ใหญ่ → CLI + พิจารณาการแยกส่วน

4. การนำเข้าข้อมูล CSV (สำคัญที่สุด: เร็วที่สุดด้วย LOAD DATA)

เมื่อนำเข้าข้อมูล CSV วิธีที่เร็วและปฏิบัติได้จริงที่สุดคือ LOAD DATA.
สำหรับชุดข้อมูลขนาดใหญ่ มันเร็วกว่าคำสั่ง INSERT อย่างมาก.

ที่นี่ เราจะให้ รูปแบบ “คัดลอกวางและรัน” ที่ถูกต้อง และเน้นจุดล้มเหลวทั่วไป.

4.1 ก่อนอื่น: ข้อกำหนดเบื้องต้นของ CSV

ก่อนนำเข้า ตรวจสอบให้แน่ใจดังต่อไปนี้.

✔ ตัวคั่น

  • คอมม่า ,
  • ทาบ \t
  • เสมิกโคลอน ; (พบบ่อยในข้อมูลต่างประเทศ)

✔ ตัวอักษรสำหรับเครื่องหมายคำพูด

  • ว่าค่าถูกห่อหุ้มเช่น "value" ด้วยเครื่องหมายคำพูดคู่หรือไม่

✔ จุดสิ้นสุดบรรทัด

  • Linux / Mac → \n
  • Windows → \r\n

✔ ชุดอักขระ / การเข้ารหัส

  • แนะนำ: utf8mb4
  • CSV ที่สร้างบน Windows อาจเป็น Shift-JIS
  • UTF-8 with BOM อาจทำให้เกิดข้อผิดพลาดบางครั้ง

ตัวอย่างการตรวจสอบ:

file -i example.csv

4.2 รูปแบบพื้นฐานพร้อมคัดลอกวาง (CSV ที่มีส่วนหัว)

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id, name, @age)
SET age = NULLIF(@age,'');

ความหมายของตัวเลือกแต่ละตัว

  • LOCAL อ่านไฟล์จากฝั่งไคลเอนต์ (จำเป็นในหลายสภาพแวดล้อม)
  • IGNORE 1 LINES ข้ามแถวหัวตาราง
  • @age ตัวแปรชั่วคราวที่ใช้แปลงค่าก่อนบันทึก
  • NULLIF() แปลงสตริงว่างเป็น NULL

4.3 นำเข้าคอลัมน์ที่คุณต้องการเท่านั้น

หากไฟล์ CSV มีคอลัมน์ที่ไม่จำเป็น:

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

แมปคอลัมน์ที่ไม่ต้องการเป็น @dummy .

4.4 แปลงวันที่และประเภทระหว่างการนำเข้า

ตัวอย่าง: แปลง MM/DD/YYYY → รูปแบบ MySQL

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(@date_col, name)
SET date_col = STR_TO_DATE(@date_col, '%m/%d/%Y');

4.5 สำหรับไฟล์ที่คั่นด้วยแท็บ (TSV)

FIELDS TERMINATED BY '\t'

4.6 ปรับปรุงประสิทธิภาพต่อไป (สำหรับข้อมูลขนาดใหญ่)

ปิดการทำงานของดัชนีชั่วคราว

ALTER TABLE example_table DISABLE KEYS;
-- Run LOAD DATA
ALTER TABLE example_table ENABLE KEYS;

ปิดการทำงานของคีย์ต่างประเทศชั่วคราว

SET FOREIGN_KEY_CHECKS=0;
-- Run LOAD DATA
SET FOREIGN_KEY_CHECKS=1;

ทำไม LOCAL มักจำเป็น

  • LOAD DATA INFILE → อ่านไฟล์จากฝั่งเซิร์ฟเวอร์
  • LOAD DATA LOCAL INFILE → อ่านไฟล์จากฝั่งไคลเอนต์

ในหลายสภาพแวดล้อม, การใช้ LOCAL มีอัตราความสำเร็จสูงกว่า.

✔ รูปแบบที่แนะนำในการปฏิบัติ

ในกรณีส่วนใหญ่:

LOAD DATA LOCAL INFILE
+ explicit delimiter
+ explicit line endings
+ IGNORE 1 LINES
+ type conversion

นี่เป็นวิธีที่เสถียรที่สุด.

5. สาเหตุหลัก 4 ประการที่ INFILE ล้มเหลว (ส่วนสำคัญที่สุด)

ความล้มเหลือส่วนใหญ่ของ LOAD DATA INFILE เกิดจาก การตั้งค่า, สิทธิ์, หรือความเข้าใจผิดเกี่ยวกับตำแหน่งแหล่งข้อมูล.
หากคุณเข้าใจเรื่องนี้, คุณสามารถแก้ไขข้อผิดพลาดส่วนใหญ่ได้ทันที.

5.1 ความแตกต่างระหว่าง INFILE และ LOCAL INFILE

นี่คือแนวคิดพื้นฐานสำคัญ.

CommandWhere it reads fromTypical use
LOAD DATA INFILEFile on the serverA fixed path on the server
LOAD DATA LOCAL INFILEFile on the clientA CSV on your local PC

ความเข้าใจผิดทั่วไป

  • พยายามอ่านไฟล์จาก PC ของคุณด้วย INFILE แล้วล้มเหลว
  • ไฟล์ไม่มีอยู่บนเซิร์ฟเวอร์

✔ กฎโดยสังเขป

  • CSV บน PC ของคุณเอง → LOCAL
  • CSV ที่วางบนเซิร์ฟเวอร์ → INFILE

หากไม่แน่ใจ, การใช้ LOCAL เป็นตัวเลือกที่ปลอดภัยที่สุด.

5.2 local_infile ถูกปิด (สาเหตุของ ERROR 1148)

ตัวอย่างข้อผิดพลาด:

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

สาเหตุ:

local_infile ปิดอยู่

✔ ตรวจสอบการตั้งค่าปัจจุบัน

SHOW VARIABLES LIKE 'local_infile';

✔ เปิดใช้งานเมื่อเชื่อมต่อ (ฝั่งไคลเอนต์)

mysql --local-infile=1 -u user -p

✔ เปิดใช้งานอย่างถาวร (ไฟล์กำหนดค่า)

เพิ่มใน my.cnf หรือ my.ini:

[mysqld]
local_infile=1

คุณต้องรีสตาร์ทเซิร์ฟเวอร์.

5.3 ข้อจำกัด secure_file_priv

สิ่งนี้เกิดขึ้นเมื่อใช้ LOAD DATA INFILE (โดยไม่มี LOCAL).

ตรวจสอบ:

SHOW VARIABLES LIKE 'secure_file_priv';

ตัวอย่างผลลัพธ์

/var/lib/mysql-files/

→ คุณสามารถอ่านไฟล์ได้เฉพาะในไดเรกทอรีนี้เท่านั้น.

✔ วิธีแก้

  • ย้ายไฟล์ CSV ไปยังไดเรกทอรีที่อนุญาต
  • หรือใช้ LOCAL

5.4 สิทธิ์ไม่เพียงพอ (สิทธิ์ FILE / สิทธิ์ระบบปฏิบัติการ)

ตัวอย่างข้อผิดพลาด:

ERROR 1045: Access denied

ตรวจสอบ:

SHOW GRANTS FOR 'user'@'localhost';

✔ สิทธิ์ที่ต้องการ

GRANT FILE ON *.* TO 'user'@'localhost';

※ เพื่อความปลอดภัย, ให้ทำงานด้วยสิทธิ์ที่น้อยที่สุดเท่าที่เป็นไปได้.

5.5 การระบุเส้นทางที่ไม่ถูกต้อง

  • ใช้เส้นทางแบบเต็ม (absolute path) ไม่ใช่เส้นทางแบบสัมพันธ์ (relative path)
  • บน Windows แนะนำให้ใช้ C:/path/file.csv
  • เครื่องหมายทับหน้า (forward slash) ปลอดภัยกว่าตัวทับหลัง (backslash)

✔ กระบวนการแก้ปัญหาอย่างรวดเร็วสำหรับปัญหา INFILE

  1. คุณได้เพิ่ม LOCAL หรือยัง?
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. ตรวจสอบสิทธิ์ (SHOW GRANTS)
  5. ตรวจสอบเส้นทาง (absolute path)

ตามลำดับนี้, คุณสามารถแก้ไขกรณีส่วนใหญ่ได้.

6. นำเข้าผ่าน GUI (Workbench / phpMyAdmin)

The command line is the most stable, but there are situations where you want to use GUI tools.
Here, we’ll focus on the common points where people get stuck in real work.

6.1 Import with MySQL Workbench

Import an SQL file (backup restore)

  1. Launch Workbench
    เปิด Workbench
  2. Menu → Server → Data Import
    เมนู → Server → Data Import
  3. Select “Import from Self-Contained File”
    เลือก “Import from Self-Contained File”
  4. Select the .sql file
    เลือกไฟล์ .sql
  5. Select the Target Schema (database)
    เลือก Target Schema (ฐานข้อมูล)
  6. Click “Start Import”
    คลิก “Start Import”

Import CSV (per table)

  1. Right-click the target table
    คลิกขวาที่ตารางเป้าหมาย
  2. Select Table Data Import Wizard
    เลือก Table Data Import Wizard
  3. Select the CSV file
    เลือกไฟล์ CSV
  4. Set delimiter and whether there is a header
    ตั้งค่าตัวคั่นและว่ามีหัวตารางหรือไม่
  5. Run
    ดำเนินการ

⚠ Common reasons Workbench gets stuck

  • Large files (hundreds of MB or more)
    ไฟล์ขนาดใหญ่ (หลายร้อย MB หรือมากกว่า)
  • Timeouts
    หมดเวลา
  • Encoding mismatch
    การเข้ารหัสไม่ตรงกัน
  • secure_file_priv restrictions
    ข้อจำกัด secure_file_priv

👉 For large files or production environments, CLI is recommended.
👉 สำหรับไฟล์ขนาดใหญ่หรือสภาพแวดล้อมการผลิต แนะนำให้ใช้ CLI.

6.2 Import with phpMyAdmin

Steps

  1. Select the target database
    เลือกฐานข้อมูลเป้าหมาย
  2. Open the “Import” tab
    เปิดแท็บ “Import”
  3. Choose a file
    เลือกไฟล์
  4. Select the format (SQL / CSV)
    เลือกรูปแบบ (SQL / CSV)
  5. Run
    ดำเนินการ

⚠ phpMyAdmin limitations

① Upload size limit

upload_max_filesize
post_max_size

Large files will fail.
ไฟล์ขนาดใหญ่จะล้มเหลว.

② Timeout
max_execution_time

Long-running imports may stop mid-way.
การนำเข้าที่ใช้เวลานานอาจหยุดกลางทาง.

③ Out of memory
memory_limit

6.3 When you should use GUI

  • Small datasets (a few MB)
    ชุดข้อมูลขนาดเล็ก (ไม่กี่ MB)
  • Development environments
    สภาพแวดล้อมการพัฒนา
  • Temporary one-off work
    งานชั่วคราวแบบครั้งเดียว

6.4 When you should use CLI (recommended)

  • Production environments
    สภาพแวดล้อมการผลิต
  • Tens of MB or more
    หลายสิบ MB หรือมากกว่า
  • Large CSV imports
    การนำเข้า CSV ขนาดใหญ่
  • When you need error analysis
    เมื่อคุณต้องการวิเคราะห์ข้อผิดพลาด
  • Server-to-server migrations
    การย้ายข้อมูลระหว่างเซิร์ฟเวอร์

✔ Practical conclusion

GUI is “easy,” but
CLI is overwhelmingly better for stability, reproducibility, and large-file handling.
GUI “ง่าย” แต่ CLI ดีกว่าอย่างมากในเรื่องความเสถียร ความสามารถทำซ้ำได้ และการจัดการไฟล์ขนาดใหญ่.

For troubleshooting, learning CLI operations is ultimately recommended.
สำหรับการแก้ไขปัญหา การเรียนรู้การใช้ CLI เป็นสิ่งที่แนะนำในที่สุด.

7. Troubleshooting (By Error: Cause → Fastest Fix)

Most MySQL import errors are highly patterned.
Here, we’ll organize them in the order “cause → first action → verification command.”
ข้อผิดพลาดการนำเข้า MySQL ส่วนใหญ่ มีรูปแบบที่ชัดเจน ที่นี่ เราจะจัดเรียงตาม “สาเหตุ → การกระทำแรก → คำสั่งตรวจสอบ”.

7.1 ERROR 1148 (42000)

The used command is not allowed with this MySQL version
คำสั่งที่ใช้ไม่ได้รับอนุญาตกับเวอร์ชัน MySQL นี้

🔎 Cause

  • LOAD DATA LOCAL INFILE is disabled
    LOAD DATA LOCAL INFILE ถูกปิดใช้งาน
  • local_infile is OFF
    local_infile ปิดอยู่

✅ Fastest fix

① Check current settings
① ตรวจสอบการตั้งค่าปัจจุบัน

SHOW VARIABLES LIKE 'local_infile';

② Enable when connecting (client-side)
② เปิดใช้งานเมื่อเชื่อมต่อ (ฝั่งไคลเอนต์)

mysql --local-infile=1 -u user -p

③ Enable permanently (if needed)
③ เปิดใช้งานอย่างถาวร (หากต้องการ)

[mysqld]
local_infile=1

→ Restart MySQL
→ รีสตาร์ท MySQL

7.2 ERROR 1366

Incorrect string value
ค่า string ไม่ถูกต้อง

🔎 Cause

  • Encoding mismatch
    การเข้ารหัสไม่ตรงกัน
  • Inconsistency between utf8 and utf8mb4
    ความไม่สอดคล้องระหว่าง utf8 และ utf8mb4
  • Shift-JIS mixed in
    มี Shift-JIS ปะปนอยู่

✅ Fastest fix

① Check current character set
① ตรวจสอบชุดอักขระปัจจุบัน

SHOW VARIABLES LIKE 'character_set%';

② Convert table to utf8mb4
② แปลงตารางเป็น utf8mb4

ALTER TABLE example_table CONVERT TO CHARACTER SET utf8mb4;

③ Specify it explicitly at import time
③ ระบุอย่างชัดเจนในขณะนำเข้า

mysql --default-character-set=utf8mb4 -u user -p db < file.sql

7.3 ERROR 1062

Duplicate entry
รายการซ้ำ

🔎 Cause

  • Duplicate primary keys
    คีย์หลักซ้ำ
  • UNIQUE constraint violation
    การละเมิดข้อจำกัด UNIQUE

✅ Fix options

Option 1: Ignore duplicates
ตัวเลือก 1: เพิกเฉยต่อรายการซ้ำ
LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE example_table
IGNORE;
Option 2: Update on duplicate
ตัวเลือก 2: อัปเดตเมื่อซ้ำ
INSERT INTO example_table (id, name)
VALUES (1,'John')
ON DUPLICATE KEY UPDATE name=VALUES(name);
Option 3: Use a staging table
ตัวเลือก 3: ใช้ตาราง staging
CREATE TEMPORARY TABLE temp LIKE example_table;
-- LOAD into temp first
INSERT INTO example_table
SELECT * FROM temp;

7.4 ERROR 1045

Access denied for user
การเข้าถึงถูกปฏิเสธสำหรับผู้ใช้

🔎 Cause

  • Insufficient DB privileges
    สิทธิ์ฐานข้อมูลไม่เพียงพอ
  • Insufficient FILE privilege
    สิทธิ์ FILE ไม่เพียงพอ
  • Insufficient OS permissions for the path
    สิทธิ์ระบบปฏิบัติการสำหรับเส้นทางไม่เพียงพอ

✅ Check

SHOW GRANTS FOR 'user'@'localhost';

✅ Example required privileges

GRANT ALL PRIVILEGES ON example_db.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

※ Be cautious when granting FILE privilege.
※ ระมัดระวังเมื่อให้สิทธิ์ FILE.

7.5 It stops mid-way on large files

🔎 Cause

  • หมดเวลา
  • หน่วยความจำไม่พอ
  • ขีดจำกัดของ PHP (phpMyAdmin)

✅ วิธีแก้ไขที่เร็วที่สุด

เพิ่มเวลา timeout
SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;
แบ่งไฟล์
split -l 100000 large.csv part_

✔ กระบวนการแก้ไขข้อผิดพลาด (เร็วที่สุด)

  1. ตรวจสอบการเข้ารหัส
  2. ตรวจสอบ local_infile
  3. ตรวจสอบ secure_file_priv
  4. ตรวจสอบสิทธิ์
  5. ตรวจสอบการจบบรรทัด ( \n / \r\n )

ตามลำดับนี้ คุณสามารถแก้ไขปัญหาส่วนใหญ่ได้.

8. เทคนิคในโลกจริงสำหรับชุดข้อมูลขนาดใหญ่ (การดำเนินการที่ไม่ล้มเหลว)

เมื่อทำการนำเข้าหลักแสนถึงหลายล้านแถว,
วิธีปกติอาจช้า, หยุดทำงาน, หรือขัดข้อง.

ต่อไปนี้คือเทคนิคที่เสถียรและมักใช้ในสภาพแวดล้อมการผลิต.

8.1 แบ่งไฟล์และนำเข้าเป็นขั้นตอน

การป้อน CSV/SQL ขนาดใหญ่ในครั้งเดียวอาจทำให้เกิดปัญหาหน่วยความจำและหมดเวลา.

✔ Linux / Mac

split -l 100000 large.csv part_

→ แบ่งเป็น 100,000 บรรทัดต่อส่วน

✔ Windows (ตัวอย่าง PowerShell)

Get-Content large.csv -TotalCount 100000 > part_1.csv

✔ ประโยชน์ของการนำเข้าเป็นขั้นตอน

  • ง่ายต่อการลองใหม่หลังจากความล้มเหลวบางส่วน
  • ง่ายต่อการระบุตำแหน่งข้อผิดพลาด
  • โหลดเซิร์ฟเวอร์เสถียรขึ้น

8.2 ปิดการทำงานของดัชนีและคีย์ต่างประเทศชั่วคราว

ระหว่างการนำเข้า การอัปเดตดัชนีมักเป็นคอขวด.

✔ ปิดการทำงานของดัชนีชั่วคราว

ALTER TABLE example_table DISABLE KEYS;
-- LOAD DATA
ALTER TABLE example_table ENABLE KEYS;

※ ส่วนใหญ่สำหรับ MyISAM มีผลจำกัดสำหรับ InnoDB.

✔ ปิดการทำงานของคีย์ต่างประเทศ

SET FOREIGN_KEY_CHECKS=0;
-- import
SET FOREIGN_KEY_CHECKS=1;

8.3 ควบคุม autocommit (เร่งความเร็ว)

SET autocommit=0;
-- LOAD DATA
COMMIT;
SET autocommit=1;

8.4 การตั้งค่าที่แนะนำสำหรับการโหลดจำนวนมาก

SET UNIQUE_CHECKS=0;
SET FOREIGN_KEY_CHECKS=0;
SET AUTOCOMMIT=0;

หลังการนำเข้า:

COMMIT;
SET UNIQUE_CHECKS=1;
SET FOREIGN_KEY_CHECKS=1;
SET AUTOCOMMIT=1;

⚠ ใช้อย่างระมัดระวังในสภาพแวดล้อมการผลิต.

8.5 เพิ่มเวลา timeout

SET GLOBAL net_read_timeout=600;
SET GLOBAL net_write_timeout=600;

8.6 กลยุทธ์ตาราง staging (การดำเนินการที่ปลอดภัย)

แทนที่จะนำเข้าโดยตรงสู่ตารางการผลิต ให้ใช้ตารางตรวจสอบความถูกต้องก่อน.

CREATE TABLE staging LIKE example_table;
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE staging;

หลังการตรวจสอบความถูกต้อง:

INSERT INTO example_table
SELECT * FROM staging;

✔ รูปแบบที่เสถียรที่สุดในโลกจริง

  1. โหลดเข้าสู่ตาราง staging
  2. ตรวจสอบจำนวนแถว
  3. ตรวจสอบข้อจำกัด
  4. นำไปใช้ในการผลิต
  5. บันทึกบันทึกเหตุการณ์

✔ สรุปสำหรับข้อมูลขนาดใหญ่

  • ใช้ CLI เมื่อเป็นไปได้
  • แบ่งการนำเข้า
  • ผ่านขั้นตอน staging
  • ปิดการทำงานของข้อจำกัดชั่วคราว
  • ตรวจสอบบันทึกเหตุการณ์

นี่จะทำให้การนำเข้าเสถียรแม้จะเป็นหลายล้านแถว.

9. คำถามที่พบบ่อย (FAQ)

ต่อไปนี้เป็นคำตอบที่รวดเร็วและเป็นประโยชน์ต่อคำถามที่มักค้นหาเกี่ยวกับการนำเข้า MySQL.

Q1. ฉันสามารถนำเข้าเฉพาะคอลัมน์ที่ต้องการจาก CSV ได้หรือไม่?

ได้, คุณสามารถทำได้.

คุณสามารถแมปคอลัมน์ที่ไม่จำเป็นไปยังตัวแปร (เช่น @dummy) และละเว้นมัน.

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

หากคุณต้องการเฉพาะคอลัมน์บางคอลัมน์ อย่าลืม ระบุลำดับคอลัมน์อย่างชัดเจน.

Q2. ฉันจะทำให้เซลล์ว่างเป็น NULL ได้อย่างไร?

ใช้ NULLIF().

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
(name, @age)
SET age = NULLIF(@age,'');

นี่จะแปลงสตริงว่าง (”) ให้เป็น NULL.

Q3. ฉันจะข้ามแถวหัวตารางได้อย่างไร?

IGNORE 1 LINES

ตัวอย่าง:

LOAD DATA LOCAL INFILE '/path/to/example.csv'
INTO TABLE example_table
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

Q4. ฉันจะตรวจสอบผลการนำเข้าได้อย่างไร?

✔ ตรวจสอบจำนวนแถว

SELECT COUNT(*) FROM example_table;

✔ ตรวจสอบคำเตือน/ข้อผิดพลาด

ตรวจสอบคำเตือนของ MySQL:

SHOW WARNINGS;

✔ กลยุทธ์ตาราง staging (แนะนำ)

โหลดเข้า staging table ก่อน จากนั้นนำไปใช้กับ production。

Q5. วิธีไหนที่เร็วที่สุด?

สรุป:

  • CSV → LOAD DATA LOCAL INFILE (เร็วที่สุด)
  • Backup restore → mysql command

GUI สะดวก แต่ CLI ชนะเรื่องความเร็วและความเสถียร

Q6. ฉันได้รับข้อผิดพลาดเกี่ยวกับการสิ้นสุดบรรทัดบน Windows

เกิดจาก line endings。

Windows:

LINES TERMINATED BY '\r\n'

Linux / Mac:

LINES TERMINATED BY '\n'

Q7. ฉันได้รับข้อผิดพลาด secure_file_priv

ตรวจสอบ:

SHOW VARIABLES LIKE 'secure_file_priv';

แก้ไข:

  • วาง CSV ในไดเรกทอรีที่อนุญาต
  • หรือใช้ LOCAL

✔ สรุป FAQ

  • การแมปคอลัมน์ → @dummy
  • การแปลง NULL → NULLIF
  • ข้ามส่วนหัว → IGNORE 1 LINES
  • การนำเข้าด้วยความเร็วสูง → LOAD DATA
  • จุดติดขัดหลัก → local_infile / secure_file_priv / encoding

10. สรุป

การนำเข้า MySQL อาจดูซับซ้อนในตอนแรก แต่
เมื่อจัดระเบียบตามเป้าหมายแล้ว จะตรงไปตรงมาและง่ายมาก

มาทบทวนเส้นทางสู่ความสำเร็จที่สั้นที่สุดกัน。

✔ คืนค่าจากไฟล์ SQL (.sql)

เร็วและเสถียรที่สุด:

mysql -u user -p dbname < backup.sql
  • ตรวจสอบว่า DB มีอยู่หรือไม่
  • ตรวจสอบสิทธิ์
  • แนะนำ utf8mb4 สำหรับ encoding

✔ นำเข้า CSV (เร็ว)

รูปแบบพื้นฐาน:

LOAD DATA LOCAL INFILE '/path/to/file.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 LINES;

ประเด็นสำคัญ:

  • Windows line endings → \r\n
  • สตริงว่าง → NULLIF()
  • หากล้มเหลว ตรวจสอบ local_infile

✔ ลำดับการตรวจสอบปัญหา

  1. Encoding (แนะนำ utf8mb4)
  2. SHOW VARIABLES LIKE 'local_infile';
  3. SHOW VARIABLES LIKE 'secure_file_priv';
  4. สิทธิ์ (SHOW GRANTS)
  5. Line endings

ในลำดับนี้ คุณสามารถแก้ไขปัญหาส่วนใหญ่ได้。

✔ กฎทองสำหรับชุดข้อมูลขนาดใหญ่

  • ใช้ CLI
  • แยกการนำเข้า
  • ผ่านตาราง staging
  • ปิด foreign keys/constraints ชั่วคราว
  • ตรวจสอบ logs

✔ สรุปสุดท้าย

  • Backup restore → mysql command
  • นำเข้า CSV ด้วยความเร็วสูง → LOAD DATA LOCAL INFILE
  • งานเล็กๆ ครั้งเดียว → GUI

หากไม่แน่ใจ การใช้ CLI คือตัวเลือกที่เสถียรที่สุด。

ด้วยสิ่งนี้ คุณมีชุดความรู้ครบถ้วนสำหรับการนำเข้า MySQL แล้ว。

ลองทำในสภาพแวดล้อมของคุณและสร้างกระบวนการทำงานที่เสถียร