การแปลง SQL (SQL Conversion) คือกระบวนการดึงข้อมูลจากสคริปต์ SQL และจัดระเบียบใหม่เป็นรูปแบบข้อมูลอื่นเช่น JSON, CSV, XML, YAML, HTML, Markdown ฯลฯ SQL (Structured Query Language, ภาษาสอบถามแบบมีโครงสร้าง) เป็นภาษาสอบถามมาตรฐานสำหรับฐานข้อมูลเชิงสัมพันธ์ เครื่องมือส่งออกฐานข้อมูล (เช่น mysqldump, pg_dump) มักส่งออกข้อมูลเป็นคำสั่ง INSERT ในรูปแบบสคริปต์ SQL รูปแบบนี้แม้สะดวกสำหรับการนำเข้าฐานข้อมูล แต่ไม่สะดวกสำหรับการอ่านโดยโปรแกรม การวิเคราะห์ข้อมูล หรือการแลกเปลี่ยนข้ามระบบ จึงจำเป็นต้องแปลงเป็นรูปแบบที่เป็นสากลมากขึ้น
สคริปต์ส่งออกข้อมูล SQL ทั่วไปมีสองประเภทคำสั่ง: CREATE TABLE สำหรับนิยามโครงสร้างตาราง (ชื่อคอลัมน์, ประเภทข้อมูล, ข้อจำกัด) และ INSERT INTO ... VALUES (...) สำหรับแทรกข้อมูลเฉพาะ ตัวแปลงนี้วิเคราะห์ทั้งสองประเภทคำสั่ง ดึงนิยามคอลัมน์และข้อมูลประเภทจาก CREATE TABLE, แถวข้อมูลจริงจาก INSERT จากนั้นจัดผลลัพธ์ใหม่ตามรูปแบบที่ผู้ใช้เลือก กระบวนการวิเคราะห์ทั้งหมดทำในเบราว์เซอร์ ไม่ขึ้นกับบริการ backend ใด ๆ
เหตุใดจึงต้องแปลง SQL เป็นรูปแบบอื่น? สคริปต์ SQL แม้เป็นสากล แต่ไม่สะดวกในสถานการณ์ต่อไปนี้: หนึ่ง, โปรแกรม frontend อ่าน JSON ได้ง่ายกว่าการวิเคราะห์ SQL มาก โดยไม่ต้องเพิ่มตัววิเคราะห์ SQL; สอง, ซอฟต์แวร์สเปรดชีตเช่น Excel, Google Sheets รองรับ CSV โดยกำเนิดไม่ใช่ SQL; สาม, ในสถานการณ์ไฟล์การตั้งค่าและเอกสาร YAML, Markdown อ่านง่ายกว่า SQL; สี่, การแลกเปลี่ยนข้อมูลข้ามระบบมักใช้ XML หรือ JSON เป็นรูปแบบกลาง หลังแปลง SQL เป็นรูปแบบสากลเหล่านี้ ข้อมูลสามารถถูกบริโภคโดยตรงโดยเครื่องมือและภาษาได้มากขึ้น
ตัววิเคราะห์ SQL ของตัวแปลงนี้เขียนด้วยมือ เน้นที่การวิเคราะห์คำสั่ง INSERT และ CREATE TABLE สำหรับ INSERT รองรับทั้ง tuple เดี่ยว (INSERT INTO t (a,b) VALUES (1,2)) และ tuple หลายค่า (INSERT INTO t (a,b) VALUES (1,2), (3,4), (5,6)) แมปข้อมูลตามชื่อคอลัมน์อัตโนมัติ สำหรับ CREATE TABLE รองรับการวิเคราะห์นิยามคอลัมน์, ประเภทข้อมูล (VARCHAR(255), INT, DECIMAL(10,2) ฯลฯ พร้อมความยาวในวงเล็บ), ข้อจำกัดและ clauses NOT NULL, PRIMARY KEY, IF NOT EXISTS จัดการวงเล็บซ้อนอย่างถูกต้องเพื่อหลีกเลี่ยงการแบ่งผิด
การระบุประเภทเป็นแง่มุมสำคัญของการแปลง SQL ตัวแปลงกำหนดประเภทโดยอัตโนมัติตามรูปแบบ literal ของค่า: ค่าที่หุ้มด้วยอัญประกาศเดี่ยวหรือคู่เป็นสตริง; NULL (ไม่คำนึงถึงตัวพิมพ์เล็ก/ใหญ่) เป็นค่าว่าง; TRUE/FALSE เป็นบูลีน; 0x..., X'...', B'...' เป็น literal ฐานสิบหก; ตัวเลขล้วน (มีเครื่องหมายลบ, จุดทศนิยม, สัญกรณ์วิทยาศาสตร์) เป็นตัวเลข การระบุประเภทอัตโนมัตินี้รับประกันว่ารูปแบบการแปลงเช่น JSON, CSV จะรักษาความหมายของข้อมูลเดิม (เช่นตัวเลข 1 ไม่ใช่สตริง "1") สะดวกสำหรับการประมวลผลที่ถูกต้องโดยโปรแกรม downstream
ความแตกต่างของรูปแบบเครื่องหมายคำพูดระหว่างภาษาย่อยของฐานข้อมูลเป็นกับดักทั่วไปในการวิเคราะห์ SQL MySQL ใช้ backtick (`) สำหรับหุ้ม identifier (ชื่อตาราง, ชื่อคอลัมน์) โดยค่าเริ่มต้น, PostgreSQL ใช้อัญประกาศคู่ ("), SQL Server/T-SQL ใช้วงเล็บเหลี่ยม ([]), SQL มาตรฐานก็ใช้อัญประกาศคู่เช่นกัน ฟังก์ชัน unquoteIdentifier ของตัวแปลงนี้ระบุและลบเครื่องหมายคำพูดเหล่านี้อัตโนมัติ พร้อมจัดการ escape ภายในเครื่องหมายคำพูด (เช่น `` → `, "" → ") ในโหมดสร้าง SQL ใหม่ คำสั่ง INSERT จะถูกสร้างใหม่ด้วยรูปแบบเครื่องหมายคำพูดที่เกี่ยวข้องสำหรับภาษาย่อยเป้าหมาย
Escape สตริง SQL เป็นรายละเอียดทางเทคนิคสำคัญอีกประการ มาตรฐาน SQL นิยามการ escape อัญประกาศเดี่ยวในสตริงโดยการเพิ่มเป็นสองตัว ('It''s' แทน It's), MySQL โดยค่าเริ่มต้นยังรองรับ escape ด้วย backslash (\n, \t, \', \", \\\\, \0, \Z ฯลฯ) ตัววิเคราะห์สตริงของตัวแปลงนี้จัดการกลไก escape ทั้งสองพร้อมกัน กู้คืนเนื้อหาสตริงเดิมอย่างถูกต้อง เมื่อแปลงเป็น CSV field ที่มีจุลภาค, เครื่องหมายคำพูด, newline จะถูก escape ใหม่ตามมาตรฐาน RFC 4180; เมื่อแปลงเป็น XML/HTML อักขระพิเศษเช่น &, <, >, ", ' จะถูก escape
การประมวลผล frontend ล้วนเป็นหลักการออกแบบหลักของตัวแปลงนี้ การวิเคราะห์ SQL และการแปลงข้อมูลทั้งหมดทำใน JavaScript engine ของเบราว์เซอร์ ไม่ส่งข้อมูลใด ๆ ไปยังเซิร์ฟเวอร์ นั่นหมายความว่าแม้สคริปต์ SQL จะมีข้อมูลละเอียดอ่อนของผู้ใช้, ข้อมูลทางธุรกิจที่ละเอียดอ่อน หรือโครงสร้างฐานข้อมูลภายใน ก็จะไม่รั่วไหลออกไป การออกแบบนี้เหมาะอย่างยิ่งสำหรับการประมวลผลการส่งออกฐานข้อมูลการผลิต ไม่ต้องกังวลเรื่องการปฏิบัติตามข้อกำหนดข้อมูล ในขณะเดียวกันการประมวลผล frontend ไม่มี latency ของเครือข่าย ความเร็วในการแปลงจำกัดเพียงโดย CPU และหน่วยความจำของอุปกรณ์
เปรียบเทียบกับเครื่องมือแปลง SQL บรรทัดคำสั่งแบบดั้งเดิม (เช่น sql2csv, sqlparser) ตัวแปลงนี้มีข้อได้เปรียบหลายประการ: ไม่ต้องติดตั้งและตั้งค่าสภาพแวดล้อม เปิดหน้าเว็บก็ใช้ได้; มีอินเทอร์เฟซแบบภาพสำหรับดูตัวอย่างผลลัพธ์การแปลงแบบเรียลไทม์; รองรับการแปลงระหว่างรูปแบบผลลัพธ์หลายแบบด้วยคลิกเดียว; มีข้อมูลตัวอย่างและเอกสารช่วยเหลือในตัว; ดีไซน์ responsive สำหรับมือถือใช้ได้ทุกที่ อย่างไรก็ตามตัวแปลงนี้เน้นที่การดึงข้อมูล ไม่จัดการความแตกต่างของภาษาย่อย SQL ที่ซับซ้อน (เช่น โอเปอเรเตอร์ JSONB ของ PostgreSQL, ON DUPLICATE KEY UPDATE ของ MySQL) และคุณสมบัติขั้นสูง (stored procedure, function, trigger); เมื่อมีความต้องการเช่นนั้น แนะนำให้ใช้เครื่องมือฐานข้อมูล native หรือแพลตฟอร์ม ETL เฉพาะทาง
เมื่อใช้ตัวแปลง SQL มีแนวปฏิบัติที่ดีหลายประการที่ควรทราบ: หนึ่ง, ก่อนแปลงให้ตรวจสอบว่าสคริปต์ SQL มีข้อมูลครบถ้วน (คำสั่ง INSERT) ไม่ใช่มีเพียงคำสั่ง query (SELECT), SELECT จะไม่ถูกวิเคราะห์; สอง, สำหรับสคริปต์ SQL หลายตาราง แนะนำให้เปิด «ส่งออกหลายตารางแยก» เพื่อรักษาข้อมูลโครงสร้างตาราง; สาม, เมื่อประมวลผล SQL ที่มีอักขระจีน สำหรับผลลัพธ์ CSV แนะนำให้เปิด «รวม BOM» เพื่อให้ Excel ระบุการเข้ารหัสอย่างถูกต้อง; สี่, เมื่อประมวลผล SQL dump ขนาดใหญ่ แนะนำให้ปิด «ผลลัพธ์สวยงาม» เพื่อลดขนาดผลลัพธ์; ห้า, เมื่อย้ายระหว่างฐานข้อมูล สามารถใช้โหมด «สร้าง SQL ใหม่» เพื่อเปลี่ยนภาษาย่อย แต่ประเภทที่ซับซ้อน (เช่น array ของ PostgreSQL, JSONB) อาจต้องปรับด้วยมือ