ใช้ backticks รอบชื่อฟิลด์


172

หลังจากอ่านคำตอบและความคิดเห็นเกี่ยวกับคำถาม SQL ที่นี่และได้ยินว่าเพื่อนของฉันทำงานในสถานที่ที่มีนโยบายที่ห้ามพวกเขาฉันสงสัยว่ามีอะไรผิดปกติในการใช้ backticks รอบชื่อฟิลด์ใน MySQL .

นั่นคือ:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...

24
backticks มีประโยชน์จริงๆถ้าคุณต้องการที่จะมีชื่อคอลัมน์เช่นcount, type, tableหรือคล้ายกัน
knittl


@knittl ผมคิดว่าคำถามคือควรคุณมีชื่อคอลัมน์เช่นcount, และtype tableสิ่งเหล่านี้เป็นคำศัพท์ที่คลุมเครืออย่างมากและในเกือบทุกกรณีชื่อเหล่านั้นอาจได้รับการปรับปรุงให้มีความเฉพาะเจาะจงมากขึ้น การตั้งชื่อคอลัมน์ของคุณในลักษณะที่เป็นอันตรายและเป็นแหล่งที่มาของข้อผิดพลาดอย่างที่คุณไม่เคยรู้เมื่อมีคนอาจลืมเพิ่ม backticks หรือไม่รู้ว่าพวกเขาต้องทำอะไร ฉันคิดว่าเป็นวิธีปฏิบัติที่ดีกว่าในการหลีกเลี่ยงการใช้คำสงวนเป็นชื่อคอลัมน์
dallin

ฉันใช้มันตลอดเวลาและดังนั้นฉันจึงไม่ได้อยู่ในอันตรายที่ต้องใช้คำหลักที่สงวนไว้ตลอดเวลา
Markus Zeller

คำตอบ:


153

การใช้ backticks ทำให้คุณสามารถใช้อักขระอื่นได้ ในการเขียนแบบสอบถามมันไม่ใช่ปัญหา แต่ถ้ามีใครสมมติว่าคุณสามารถใช้ backticks ได้ฉันจะสมมติว่ามันช่วยให้คุณหลุดพ้นจากเรื่องไร้สาระเช่น

SELECT `id`, `my name`, `another field` , `field,with,comma` 

ซึ่งแน่นอนสร้างตารางชื่อไม่ดี

หากคุณเป็นคนใจสั้นฉันไม่เห็นปัญหาคุณจะสังเกตว่าคุณเรียกใช้คิวรีของคุณหรือไม่

EXPLAIN EXTENDED Select foo,bar,baz 

คำเตือนที่สร้างขึ้นที่กลับมาจะมีเครื่องหมายขีดหลังและชื่อตารางที่ผ่านการรับรองโดยสมบูรณ์ ดังนั้นหากคุณใช้ฟีเจอร์การสร้างคิวรีและการเขียนคิวรีใหม่โดยอัตโนมัติแบคทีกกิ้งจะทำให้ทุกอย่างแยกรหัสของคุณสับสนน้อยลง

ฉันคิดว่าอย่างไรก็ตามแทนที่จะบังคับว่าคุณสามารถใช้ backticks ได้หรือไม่พวกเขาควรมีมาตรฐานสำหรับชื่อ มันแก้ปัญหาที่ 'จริง' มากขึ้น


เราจำเป็นต้องใช้มันใน PostgreSQL ด้วยหรือไม่
Yousuf Memon

5
ไม่จำเป็นต้องมีคำแนะนำเท่านั้น มันจะมีประโยชน์ในการเป็นตัวแทนของพวกเขาที่ยกมาเพื่อหลีกเลี่ยงความกำกวมกับคำหลัก SQL ถ้าในอนาคตคำหลัก SQL จะถูกเพิ่มที่ใช้ชื่อสาขาของคุณ ครั้งเดียวที่คุณ / ต้อง / เพื่ออ้างคือเมื่อสนามไม่แบ่งปันชื่อคำหลักเช่นselect count from fooVS select "count" from fooจะให้ผลลัพธ์ที่แตกต่างกันมาก แต่ postgres แตกต่างจาก mysql ใน 2 วิธี: 1 "". 2. ฟิลด์ที่ไม่มีเครื่องหมายอัญประกาศเป็นแบบตัวพิมพ์เล็กและตัวพิมพ์ใหญ่postgresql.org/docs/current/static/…
Kent Fredric

57

ปัญหาเดียวของ backticks คือพวกมันไม่สอดคล้องกับ ANSI-SQL เช่นพวกมันไม่ทำงานใน SQL Server

หากมีโอกาสที่คุณจะต้องย้าย SQL ของคุณไปยังฐานข้อมูลอื่นให้ใช้เครื่องหมายคำพูดคู่


15
อ๋อ ใช้โหมด ANSI ของ MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - เพื่อเปิดการใช้งานอัญประกาศคู่ใน MySQL และทำให้สามารถใช้งานร่วมกับฐานข้อมูลได้อีกครั้ง Backticks / อัญประกาศก็มีความจำเป็นเพราะคุณไม่มีทางรู้ว่าสิ่งที่จะกลายเป็นคำสงวนในรุ่น DBMS ในอนาคต
bobince

1
นั่นจริงมาก! หนึ่งในแอปพลิเคชันเซิร์ฟเวอร์ของเราทำงานได้ดีจนกระทั่งเราใช้การอัปเกรดเป็นโปรแกรมฐานข้อมูลซึ่งเพิ่มคำหลักใหม่ ทันใดนั้นทุกสิ่งที่สอบถามโต๊ะพิเศษแตก
Miquella

@ Bobince เมื่อฉันยังใหม่กับ dev ฉันตั้งชื่อคอลัมน์rangeหรืออะไรทำนองนั้น เมื่อเราอัพเกรดเป็น MySQL 5 มันล้มเหลวเพราะมันเป็นคำสงวนใหม่!
alex

1
อย่าใช้เครื่องหมายคำพูดคู่ มันจะไม่ทำงานเสมอ ตัวอย่างเช่น ... ลบจากที่ใดapp_key_stores("กุญแจ" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); การค้นหาตกลง 0 แถวที่ได้รับผลกระทบ (0.00 วินาที) ลบออกจากที่ใดapp_key_stores( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Query OK, 5 แถวที่ได้รับผลกระทบ (0.00 วินาที)
Altonymous

44

สำหรับฉันมันสมเหตุสมผลมากที่จะใช้มันตลอดเวลาเมื่อต้องจัดการกับชื่อฟิลด์

  • ประการแรกเมื่อคุณเข้าสู่นิสัยมันไม่เจ็บเพียงแค่กดปุ่มย้อนกลับ
  • ประการที่สองสำหรับฉันมันทำให้ง่ายขึ้นที่จะเห็นว่าเขตข้อมูลในแบบสอบถามของคุณคืออะไรและคำหลักหรือวิธีการคืออะไร
  • สุดท้ายช่วยให้คุณสามารถใช้ชื่อฟิลด์ใด ๆ ที่คุณต้องการเมื่อออกแบบตารางของคุณ บางครั้งการใส่ชื่อฟิลด์เป็น "คีย์", "คำสั่ง" หรือ "ค่า" เป็นเรื่องที่สมเหตุสมผล ... ซึ่งทั้งหมดนี้ต้องการ backticks เมื่อพูดถึงมัน

19
คุณควรเพิ่มว่ามันช่วยปกป้องคุณจากคำสงวนที่ใช้ในอนาคต (ซึ่งเคยกัดฉันมาก่อน)
alex

5
ที่จริงผมมีใครแก้ไข backticks พิเศษออกมาจากคำถามของฉันครั้งเดียวซึ่งผมผิดหวังเนื่องจากเหตุผลนี้เป็นเหตุผลที่แน่นอนฉันล้อมรอบทุกตัวแปรกับพวกเขา
ไบรอัน Leishman

2
นอกจากนี้ยังช่วยให้สามารถใช้ป้ายกำกับที่ไม่ใช่ภาษาอังกฤษได้อย่างปลอดภัยซึ่งเพียงอย่างเดียวก็เพียงพอที่จะสนับสนุนการใช้ backticks
Aternus

26

Backticks ไม่ได้เป็นส่วนหนึ่งของ ANSI SQL มาตรฐาน จากคู่มือ mysql :

หากเปิดใช้งานโหมด ANSI_QUOTES SQL จะอนุญาตการอ้างตัวระบุภายในเครื่องหมายคำพูดคู่

ดังนั้นหากคุณใช้ backticks และตัดสินใจที่จะย้ายออกจาก MySQL คุณมีปัญหา (แม้ว่าคุณอาจมีปัญหาที่ใหญ่กว่าเช่นกัน)


9

ไม่มีอะไรผิดปกติหากคุณใช้ MYSQL ต่อไปยกเว้นอาจเป็นเพราะภาพที่ได้จากแบบสอบถาม แต่อนุญาตให้ใช้คำหลักที่สงวนไว้หรือช่องว่างที่ฝังตัวเป็นชื่อตารางและคอลัมน์ นี่เป็นข้อผิดพลาดที่ไม่มีเอ็นจินฐานข้อมูลส่วนใหญ่และจะป้องกันการโยกย้ายในภายหลัง

สำหรับการอ่านง่ายหลายคนใช้ตัวพิมพ์ใหญ่สำหรับคำหลัก SQL เช่น

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

หากคุณถามฉันควรใช้ backticks เสมอ แต่มีสาเหตุบางประการที่ทำให้ทีมไม่ต้องการใช้พวกเขา

ข้อดี:

  • ใช้พวกเขาไม่มีคำสงวนหรือตัวอักษรต้องห้าม
  • ในบางกรณีคุณจะได้รับข้อความแสดงข้อผิดพลาดอธิบายเพิ่มเติม
  • หากคุณหลีกเลี่ยงการปฏิบัติที่ไม่ดีคุณไม่สนใจ แต่ในความจริงแล้วบางครั้งพวกเขาก็เป็นวิธีที่ดีในการหลีกเลี่ยงการแทรก SQL

ข้อเสีย:

  • พวกเขาไม่ได้มาตรฐานและมักจะไม่พกพา อย่างไรก็ตามตราบใดที่คุณไม่ใช้ backtick เป็นส่วนหนึ่งของตัวระบุ (ซึ่งเป็นวิธีปฏิบัติที่เลวร้ายที่สุดที่ฉันสามารถจินตนาการได้) คุณสามารถพอร์ตคิวรีของคุณโดยการลบ backticks ออกโดยอัตโนมัติ
  • หากข้อความค้นหาของคุณบางส่วนมาจาก Access พวกเขาอาจพูดชื่อตารางด้วย "(และบางทีคุณอาจไม่สามารถลบ" สุ่มสี่สุ่มห้าทั้งหมดออก) อย่างไรก็ตามอนุญาตให้มีการผสมแบ็คทิกและเครื่องหมายคำพูดคู่ได้
  • ซอฟต์แวร์หรือฟังก์ชั่นโง่บางตัวกรองข้อความค้นหาของคุณและมีปัญหากับ backticks อย่างไรก็ตามมันเป็นส่วนหนึ่งของ ASCII ดังนั้นนี่หมายความว่าซอฟต์แวร์ / ฟังก์ชั่นของคุณแย่มาก

9
การใช้ backticks ไม่มีส่วนเกี่ยวข้องกับการหลีกเลี่ยงการแทรก SQL
Andy Lester

6
@ อันที่จริงมันอาจช่วยได้เนื่องจากผู้โจมตีต้องปิดด้วย backtick อื่นเพื่อฉีด มันน้อย แต่ก็ยังมีบางอย่างอยู่
jasonszhao

4

มันง่ายกว่ามากในการค้นหาโค้ด - เบสของคุณเพื่อหาสิ่งที่อยู่ใน backticks eventสมมติว่าคุณมีตารางชื่อ grep -r "event" *อาจส่งคืนผลลัพธ์นับร้อยรายการ grep -r "\`event\`" *จะส่งคืนสิ่งที่อ้างอิงฐานข้อมูลของคุณ


โดยทั่วไปแล้วมันไม่ได้ประโยชน์จริงๆ ตารางที่เจอกันอย่างมืออาชีพมีชื่อเหมือน new_users_info มากกว่า "ทั่วไป"
ankush981

3

เท่าที่ฉันทราบวัตถุประสงค์ทั้งหมดของการใช้ backticks คือเพื่อให้คุณสามารถใช้ชื่อที่ตรงกับคำหลักที่สงวนไว้ ดังนั้นหากชื่อไม่ได้ขัดแย้งกับคำหลักที่สงวนไว้ฉันไม่เห็นเหตุผลใด ๆ ที่จะใช้ backticks แต่นั่นก็เป็นเหตุผลที่ห้ามไม่ให้ทำเช่นนั้น


2

สิ่งที่เรียบง่ายเกี่ยวกับ backtick ``ใช้สำหรับแสดงตัวระบุเช่น database_name, table_name ฯลฯ และเครื่องหมายคำพูดเดี่ยว'' , เครื่องหมายคำพูดคู่""สำหรับตัวอักษรสตริงในขณะที่ "" ใช้สำหรับพิมพ์ค่าตามที่เป็นและพิมพ์ตัวแปรถือหรือ ในอีกกรณีหนึ่งพิมพ์ข้อความที่เขามี

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..

0

หากคุณใช้ชื่อฟิลด์บางชื่อเป็นค่า mysql หรือ mssql ที่เป็นค่าเริ่มต้นเช่น "status" คุณจะต้องใช้ backticks ("select statusfrom table_name" หรือ "select id จาก table_name โดยที่status= 1") เนื่องจาก mysql ส่งคืนข้อผิดพลาดหรือไม่สามารถสืบค้นได้


0

การใช้ backticks หลัก (`) ใน SQL คือการใช้มันในสถานการณ์ที่คุณจะเรียกมันอีกครั้งในส่วนคำสั่งที่กำลังจะมาถึง ในเวลาอื่น ๆ ขอแนะนำให้ใช้เครื่องหมายคำพูดคู่ ("")

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

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

ในคำสั่งด้านบนคุณเห็นวิธีการPublisher and Locationใช้อีกครั้งในGROUP BYข้อ

แทนที่จะใช้

กลุ่มตามชื่อเมืองรหัส

ฉันเพิ่งใช้

จัดกลุ่มตาม Publisher and Location

เมื่อสถานการณ์ดังกล่าวเกิดขึ้นจะเป็นประโยชน์ในการใช้ backticks ในเวลาอื่น ๆ ที่แนะนำให้ใช้เครื่องหมายคำพูดคู่

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