มาตรฐาน SQL เพื่อหลีกเลี่ยงชื่อคอลัมน์?


100

มีมาตรฐาน SQL เพื่อหลีกเลี่ยงชื่อคอลัมน์หรือไม่? ถ้าไม่ใช่สิ่งที่ใช้ได้กับ MySQL และ SQLite มันใช้ได้กับ SQL Server ด้วยหรือเปล่า

คำตอบ:


91

เครื่องหมายคำพูด "

SQL: 1999มาตรฐานระบุว่าราคาคู่ ( ") ( ใบเสนอราคา MARK ) จะใช้ในการระบุที่คั่น

<delimited identifier> ::= <double quote> <delimited identifier body> <double quote>

Oracle, PostgreSQL, MySQL, MSSQL และ SQlite ทั้งหมดสนับสนุน"เป็นตัวคั่นตัวระบุ

ทั้งหมดนี้ไม่ได้ใช้"เป็น "ค่าเริ่มต้น" ตัวอย่างเช่นคุณต้องเรียกใช้ MySQL ในโหมด ANSIและ SQL Server รองรับเมื่อQUOTED_IDENTIFIERเป็นONเท่านั้น


79

ตามSQLite ,

  • 'foo' เป็นสตริง SQL
  • "foo" เป็นตัวระบุ SQL (คอลัมน์ / ตาราง / ฯลฯ )
  • [foo] เป็นตัวระบุใน MS SQL
  • `foo` เป็นตัวระบุใน MySQL

สำหรับชื่อที่มีคุณสมบัติเหมาะสมไวยากรณ์คือ: "t"."foo"หรือ[t].[foo]ฯลฯ

MySQL รองรับ "foo" มาตรฐานเมื่อANSI_QUOTESเปิดใช้งานตัวเลือก


3
โปรดทราบว่า SQLite อนุญาตให้'foo'ตีความเป็นตัวระบุหากบริบทไม่อนุญาตให้มีสตริงและ"foo"จะตีความเป็นสตริงหากบริบทไม่อนุญาตให้ใช้ตัวระบุแม้ว่าจะมีข้อสังเกตว่าพฤติกรรมนี้อาจถูกลบออกในอนาคต เวอร์ชัน
thomasrutter

แล้วคุณจะทำอย่างไร "t". *?
Loenix

2
@thomasrutter ใช่ฉันถูกกัดโดยพฤติกรรมนี้โดยสิ้นเชิง…พยายามใช้WHERE "nonexistent_column" = 0และ sqlite ก็ดำเนินการอย่างมีความสุขโดยแสร้งทำเป็นว่าฉัน"nonexistent_column"เป็นสตริง ทำให้ชื่อมีคุณสมบัติครบถ้วนเนื่องจาก"my_table"."nonexistent_column"บังคับให้ sqlite ทำงานอย่างเคร่งครัดมากขึ้น
Rufflewind

foo, "foo"และ'foo'ไม่ได้ทำงานสำหรับฉันกับ MySQL ต้องมีการย้อนกลับ และเพื่อให้เรื่องเลว, MySQL ถูกให้ข้อความผิดพลาดที่ไร้ประโยชน์
jww

22

สำหรับ MySQL ให้ใช้เครื่องหมายย้อนกลับ "

ตัวอย่างเช่น:

SELECT `column`, `column2` FROM `table`

20

สำหรับ MS SQL ให้ใช้ [และ]

SELECT [COLUMN], [COLUMN 2] FROM [TABLE]

2
คุณสามารถมีช่องว่างในชื่อคอลัมน์ด้วย ms sql!?!

3
คุณสามารถ! ฉันจะไม่แม้ว่า
JMP

1
ได้คุณสามารถเว้นวรรคหรือสงวนคำเป็นชื่อเอนทิตีใน MSSQL ได้ คุณเพียงแค่ต้อง [] พวกเขา
BoltBait

6
BTW หากคุณใช้ [และ] ใน MS SQL Server และคุณต้องการใช้อักขระ] ในชื่อตัวเอง (ไม่ว่าด้วยเหตุผลใดก็ตาม) คุณต้องหลีกเลี่ยงด้วยอักขระอื่น] (เช่นใช้)] แทน] ).
Daniel James Bryars


1

รวบรวมคำตอบไว้ด้วยกัน:

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"

กรุณาเพิ่ม / แก้ไข!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.