TL; DR : คุณต้อง จำกัดตัวอักษรทั้งหมดไม่ใช่เฉพาะในWHERE
ประโยค สำหรับเหตุผลที่พวกเขาทำไม่ได้มันอนุญาตให้ฐานข้อมูลยังคงถูกแยกออกจากระบบอื่น ๆ
ประการแรกหลักฐานของคุณมีข้อบกพร่อง คุณต้องการ จำกัด เฉพาะส่วนWHERE
คำสั่งเท่านั้นแต่นั่นไม่ได้เป็นเพียงการป้อนข้อมูลของผู้ใช้เท่านั้น ตัวอย่างเช่น,
SELECT
COUNT(CASE WHEN item_type = 'blender' THEN 1 END) as type1_count,
COUNT(CASE WHEN item_type = 'television' THEN 1 END) AS type2_count)
FROM item
นี่คือความเสี่ยงที่เท่าเทียมกันในการฉีด SQL:
SELECT
COUNT(CASE WHEN item_type = 'blender' THEN 1 END) FROM item; DROP TABLE user_info; SELECT CASE(WHEN item_type = 'blender' THEN 1 END) as type1_count,
COUNT(CASE WHEN item_type = 'television' THEN 1 END) AS type2_count)
FROM item
ดังนั้นคุณไม่สามารถ จำกัด ตัวอักษรในWHERE
ประโยคได้ คุณต้อง จำกัดตัวอักษรทั้งหมด
ตอนนี้เราเหลือคำถาม "ทำไมอนุญาตให้ตัวอักษรเลย" พึงระลึกไว้เสมอว่า: ในขณะที่ใช้ฐานข้อมูลเชิงสัมพันธ์ภายใต้แอปพลิเคชันที่เขียนด้วยภาษาอื่นในปริมาณที่มากพอสมควร แต่ก็ไม่มีข้อกำหนดต้องใช้รหัสแอปพลิเคชันเพื่อใช้ฐานข้อมูล และที่นี่เรามีคำตอบ: คุณต้องการตัวอักษรเพื่อเขียนโค้ด ทางเลือกอื่นเท่านั้นที่จะต้องใช้รหัสทั้งหมดในการเขียนในภาษาที่เป็นอิสระจากฐานข้อมูล เพื่อให้พวกเขามีความสามารถในการเขียน "รหัส" (SQL) โดยตรงในฐานข้อมูล นี่คือ decoupling ที่มีค่าและมันจะเป็นไปไม่ได้หากไม่มีตัวอักษร (ลองเขียนด้วยภาษาที่คุณชื่นชอบในบางครั้งโดยไม่ใช้ตัวอักษรฉันแน่ใจว่าคุณสามารถจินตนาการได้ว่ามันจะยากขนาดไหน)
เป็นตัวอย่างทั่วไปตัวอักษรมักใช้ในประชากรของตาราง list-of-value / look-up:
CREATE TABLE user_roles (role_id INTEGER, role_name VARCHAR(50));
INSERT INTO user_roles (1, 'normal');
INSERT INTO user_roles (2, 'admin');
INSERT INTO user_roles (3, 'banned');
หากไม่มีพวกเขาคุณจะต้องเขียนรหัสในภาษาการเขียนโปรแกรมอื่นเพียงเพื่อเติมตารางนี้ ความสามารถในการทำเช่นนั้นโดยตรงใน SQL เป็นที่มีคุณค่า
จากนั้นเราก็เหลือคำถามอีกหนึ่งข้อ: ทำไมไม่มีการเขียนโปรแกรมไลบรารีไคลเอ็นต์ภาษา และที่นี่เรามีคำตอบง่ายมาก: พวกเขาจะมีอีกครั้งใช้ตัวแยกวิเคราะห์ฐานข้อมูลทั้งหมดสำหรับแต่ละรุ่นได้รับการสนับสนุนของฐานข้อมูล ทำไม? เพราะไม่มีหนทางอื่นใดที่จะรับประกันว่าคุณจะได้พบตัวอักษรทุกตัว การแสดงออกปกติไม่เพียงพอ ตัวอย่างเช่น: ประกอบด้วย 4 ตัวอักษรแยกต่างหากใน PostgreSQL:
SELECT $lit1$I'm a literal$lit1$||$lit2$I'm another literal $$ with nested string delimiters$$ $lit2$||'I''m ANOTHER literal'||$$I'm the last literal$$;
พยายามทำเช่นนั้นจะเป็นฝันร้ายของการบำรุงรักษาโดยเฉพาะอย่างยิ่งเนื่องจากไวยากรณ์ที่ถูกต้องมักจะเปลี่ยนแปลงระหว่างการออกรุ่นใหญ่ของฐานข้อมูล
bad_ideas_sql = 'SELECT title FROM idea WHERE idea.status == "bad" AND idea.user == :mwheeler'
จะมีทั้งค่าตายตัวและกำหนดค่าพารามิเตอร์ในแบบสอบถามเดียว - ลองจับมัน! ฉันคิดว่ามีกรณีการใช้งานที่ถูกต้องสำหรับข้อความค้นหาแบบผสมเช่นนั้น