Free tutorials & notes in Hindi & English · Clean code examples · Mobile friendly learning
MySQL + SQL · Lesson 106

MySQL में CSV Import और Export

Import से पहले CSV Contract बनाएँ

CSV delimited text exchange format है, database backup नहीं। Load से पहले UTF-8 encoding, column order, header, delimiter, quote/escape rule, line ending, date/decimal format, NULL और duplicate policy तय करें।

DecisionExample
EncodingUTF-8 without BOM
HeaderOne fixed row
DateYYYY-MM-DD
Blank emailSQL NULL
Duplicate IDReject
Safe pipeline: receive → checksum/scan → staging load → validation → transaction में transform → counts/totals reconcile → policy के अनुसार archive/delete.

Spreadsheet long IDs, dates और leading zeros बदल सकता है। Uploaded CSV को untrusted input मानें; filename/value से SQL न बनाएँ।

Reproducible Import Lab

DROP TABLE IF EXISTS students_csv_lab;
CREATE TABLE students_csv_lab (
 student_id INT PRIMARY KEY,
 student_name VARCHAR(80) NOT NULL,
 email VARCHAR(190) NULL,
 admission_date DATE NOT NULL,
 fee DECIMAL(10,2) NOT NULL,
 CHECK (fee >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

UTF-8/LF में students.csv बनाएँ:

student_id,student_name,email,admission_date,fee
101,"Aman Verma",aman@example.test,2026-04-01,1250.00
102,"Sara, Khan",,2026-04-02,1500.50
103,"Kabir Rao",kabir@example.test,2026-04-03,900.00

Sara के quoted comma से enclosure test होता है और blank email SQL NULL बनेगा। Expected three rows और total fee 3650.50 है।

LOAD DATA LOCAL से Client File Import

LOCAL में client file पढ़कर MySQL को भेजता है। Server और client दोनों capability allow करें:

mysql --login-path=importer --local-infile=1 \
 --ssl-mode=VERIFY_IDENTITY --ssl-ca=/approved/ca.pem school
LOAD DATA LOCAL INFILE '/approved/import/students.csv'
INTO TABLE students_csv_lab
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' IGNORE 1 LINES
(@id,@name,@email,@date,@fee)
SET student_id=CAST(TRIM(@id) AS UNSIGNED),
 student_name=TRIM(@name),
 email=NULLIF(TRIM(@email),''),
 admission_date=STR_TO_DATE(TRIM(@date),'%Y-%m-%d'),
 fee=CAST(TRIM(BOTH '\r' FROM @fee) AS DECIMAL(10,2));

CRLF file में LINES TERMINATED BY '\r\n' declare करें। Format mismatch columns shift या carriage return retain कर सकता है।

LOCAL security: trusted, identity-verified server से ही connect करें। Permitted client directory restrict करें और web input को local path चुनने न दें।

Variables और Staging से Safe Conversion

User variables assignment से पहले text receive करते हैं। Production में all-text staging table हर source row को batch/line metadata सहित रखती है:

CREATE TABLE student_import_stage (
 batch_id CHAR(36) NOT NULL,
 source_line INT NOT NULL,
 raw_id VARCHAR(40), raw_name VARCHAR(200),
 raw_email VARCHAR(250), raw_date VARCHAR(40),
 raw_fee VARCHAR(60), validation_error VARCHAR(500),
 PRIMARY KEY(batch_id,source_line)
) ENGINE=InnoDB;
INSERT INTO students_csv_lab
 (student_id,student_name,email,admission_date,fee)
SELECT CAST(raw_id AS UNSIGNED),TRIM(raw_name),
 NULLIF(TRIM(raw_email),''),
 STR_TO_DATE(raw_date,'%Y-%m-%d'),
 CAST(raw_fee AS DECIMAL(10,2))
FROM student_import_stage
WHERE batch_id=@batch AND validation_error IS NULL;

Business owner की approved merge policy के बिना REPLACE या broad duplicate update न करें। Silent coercion से बेहतर rejected-row report है।

Counts, Warnings और Totals Validate करें

SHOW WARNINGS LIMIT 100;
SELECT COUNT(*) AS imported_rows,SUM(fee) AS total_fee,
       SUM(email IS NULL) AS missing_email
FROM students_csv_lab;
imported_rows=3 | total_fee=3650.50 | missing_email=1

Same session में warnings देखें। Strict mode/constraints useful हैं, पर business rules नहीं समझते। Exact header, column count, file size, encoding, IDs, dates, decimals, mandatory values, duplicates, counts, totals और destination authorization validate करें।

New batch load करके reconcile करें और final merge controlled transaction में करें। Sensitive rejected rows public logs में न लिखें।

Server-Side INFILE और secure_file_priv

SHOW VARIABLES LIKE 'secure_file_priv';
LOAD DATA INFILE '/var/lib/mysql-files/students.csv'
INTO TABLE students_csv_lab
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' IGNORE 1 LINES;

LOCAL के बिना server process server-host file पढ़ता है। Powerful global FILE privilege और OS read permission चाहिए।

ValueEffect
DirectoryOperations उसी directory में
NULLServer file operations disabled
EmptyNo restriction; insecure

Normal application को FILE न दें। Managed hosting disable करे तो approved client/application import use करें।

INTO OUTFILE से CSV Export

SELECT student_id,student_name,email,
 DATE_FORMAT(admission_date,'%Y-%m-%d') AS admission_date,fee
FROM students_csv_lab ORDER BY student_id
INTO OUTFILE '/var/lib/mysql-files/students_export.csv'
CHARACTER SET utf8mb4
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Server file लिखता है, इसलिए FILE, OS permissions और secure_file_priv लागू हैं। Existing file overwrite नहीं होती और header row automatic नहीं आती। Headers, exact quoting, streaming download, cloud storage या authorization के लिए controlled application/ETL library use करें।

Share करने से पहले row authorization, minimum columns, masking, spreadsheet-formula injection control, encryption और expiry लगाएँ। CSV backup नहीं है।

Production CSV Checklist

  1. Versioned contract/sample publish करें।
  2. Web root से बाहर random storage name रखें।
  3. Extension, size और content check करें।
  4. Charset, delimiter, enclosure, line ending explicit रखें।
  5. Staging में validate करके live merge करें।
  6. Least privilege और verified TLS use करें।
  7. Batch ID, counts, warnings, checksum/operator record करें।
  8. Totals/samples reconcile और retries idempotent रखें।
  9. Source/rejects encrypt, archive या securely delete करें।
  10. Commas, quotes, Unicode, blanks, CRLF/LF, duplicates test करें।

privileges, transactions और security पढ़ें।

Official संदर्भ

File location, LOCAL capability, formatting और export behavior official MySQL manual से verified हैं। Deployed version और hosting policy confirm करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

LOAD DATA INFILE और LOAD DATA LOCAL INFILE में क्या अंतर है?
LOCAL के बिना MySQL server server-host file पढ़ता है, FILE privilege चाहिए और secure_file_priv directory restrict कर सकता है। LOCAL में client client-host file पढ़कर भेजता है; client और server दोनों को LOCAL allow करना होता है।
MySQL CSV में header row कैसे skip करें?
FIELDS और LINES clauses के बाद IGNORE 1 LINES use करें। पहले file inspect करें, क्योंकि header न होने पर first data row खो जाएगी।
Blank CSV value को SQL NULL कैसे बनाएँ?
Fields user variables में load करके SET clause में NULLIF(TRIM(variable), empty-string) assign करें। Complex validation के लिए staging table use करें।
LOAD DATA LOCAL error 3950 क्यों आता है?
Server, client या connector पर LOCAL loading disabled है। इसे केवल trusted workflow के लिए enable करें, permitted local directory restrict करें और TLS से server identity verify करें।
क्या SELECT INTO OUTFILE CSV headings जोड़ता है?
नहीं। यह specified delimiters के साथ selected rows लिखता है। Header separately controlled रखें या exact CSV contract वाला application/export tool use करें।
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

💻 लाइव कोड एडिटर

इस पेज के प्रोग्राम यहीं तैयार हैं — चलाएँ, बदलें और सीखें। कुछ भी इंस्टॉल किए बिना।
OneCompiler द्वारा संचालित। कोड एडिटर में अपने आप आ जाता है — Run दबाकर आउटपुट देखें। अगर एडिटर न खुले तो नए टैब में खोलें.