มีมาตรฐาน SQL เพื่อหลีกเลี่ยงชื่อคอลัมน์หรือไม่? ถ้าไม่ใช่สิ่งที่ใช้ได้กับ MySQL และ SQLite มันใช้ได้กับ SQL Server ด้วยหรือเปล่า
มีมาตรฐาน SQL เพื่อหลีกเลี่ยงชื่อคอลัมน์หรือไม่? ถ้าไม่ใช่สิ่งที่ใช้ได้กับ MySQL และ SQLite มันใช้ได้กับ SQL Server ด้วยหรือเปล่า
คำตอบ:
"
SQL: 1999มาตรฐานระบุว่าราคาคู่ ( ") ( ใบเสนอราคา MARK ) จะใช้ในการระบุที่คั่น
<delimited identifier> ::= <double quote> <delimited identifier body> <double quote>
Oracle, PostgreSQL, MySQL, MSSQL และ SQlite ทั้งหมดสนับสนุน"
เป็นตัวคั่นตัวระบุ
ทั้งหมดนี้ไม่ได้ใช้"
เป็น "ค่าเริ่มต้น" ตัวอย่างเช่นคุณต้องเรียกใช้ MySQL ในโหมด ANSIและ SQL Server รองรับเมื่อQUOTED_IDENTIFIER
เป็นON
เท่านั้น
ตามSQLite ,
'foo'
เป็นสตริง SQL"foo"
เป็นตัวระบุ SQL (คอลัมน์ / ตาราง / ฯลฯ )[foo]
เป็นตัวระบุใน MS SQL`foo`
เป็นตัวระบุใน MySQLสำหรับชื่อที่มีคุณสมบัติเหมาะสมไวยากรณ์คือ: "t"."foo"
หรือ[t].[foo]
ฯลฯ
MySQL รองรับ "foo" มาตรฐานเมื่อANSI_QUOTES
เปิดใช้งานตัวเลือก
WHERE "nonexistent_column" = 0
และ sqlite ก็ดำเนินการอย่างมีความสุขโดยแสร้งทำเป็นว่าฉัน"nonexistent_column"
เป็นสตริง ทำให้ชื่อมีคุณสมบัติครบถ้วนเนื่องจาก"my_table"."nonexistent_column"
บังคับให้ sqlite ทำงานอย่างเคร่งครัดมากขึ้น
foo
, "foo"
และ'foo'
ไม่ได้ทำงานสำหรับฉันกับ MySQL ต้องมีการย้อนกลับ และเพื่อให้เรื่องเลว, MySQL ถูกให้ข้อความผิดพลาดที่ไร้ประโยชน์
สำหรับ MySQL ให้ใช้เครื่องหมายย้อนกลับ "
ตัวอย่างเช่น:
SELECT `column`, `column2` FROM `table`
สำหรับ MS SQL ให้ใช้ [และ]
SELECT [COLUMN], [COLUMN 2] FROM [TABLE]
สำหรับ DBASE / DBF ใช้[
และ]
SELECT [DATE], [TIME], [ANY_OTHER_TO_BE_ESCAPED_COLUMN] FROM [TABLE]
รวบรวมคำตอบไว้ด้วยกัน:
MS SQL (aka T-SQL), Microsoft Access SQL, DBASE / DBF: SELECT [COLUMN], [COLUMN2] FROM [TABLE]
MySQL: SELECT `COLUMN`, `COLUMN2` FROM `TABLE`
SQLite, Oracle, Postgresql: SELECT "COLUMN", "COLUMN2" FROM "TABLE"
กรุณาเพิ่ม / แก้ไข!
'foo'
ตีความเป็นตัวระบุหากบริบทไม่อนุญาตให้มีสตริงและ"foo"
จะตีความเป็นสตริงหากบริบทไม่อนุญาตให้ใช้ตัวระบุแม้ว่าจะมีข้อสังเกตว่าพฤติกรรมนี้อาจถูกลบออกในอนาคต เวอร์ชัน