Sử dụng backticks xung quanh tên trường


172

Sau khi đọc một vài câu trả lời và nhận xét về một số câu hỏi SQL ở đây và cũng nghe rằng một người bạn của tôi làm việc tại một nơi có chính sách cấm họ, tôi tự hỏi liệu có gì sai khi sử dụng backticks xung quanh tên trường trong MySQL không .

Đó là:

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

24
backticks là thực sự hữu ích nếu bạn muốn có tên cột như count, type, tablehoặc tương tự
knittl


@knittl Tôi nghĩ câu hỏi là, nên bạn có tên cột như count, type, và table. Đó là những thuật ngữ hết sức mơ hồ và trong hầu hết mọi trường hợp, những cái tên đó có thể được cải thiện để cụ thể hơn. Đặt tên cho cột của bạn những thứ như thế cũng nguy hiểm và là nguồn gây ra lỗi, vì bạn không bao giờ biết khi nào ai đó có thể quên thêm backticks hoặc không nhận ra chúng phải mắc. Tôi nghĩ rằng tốt hơn hết là tránh sử dụng thuật ngữ dành riêng làm tên cột.
dallin

Tôi luôn sử dụng chúng và vì vậy tôi không gặp nguy hiểm khi sử dụng các từ khóa dành riêng bất cứ lúc nào.
Markus Zeller

Câu trả lời:


153

Sử dụng backticks cho phép bạn sử dụng các ký tự thay thế. Trong truy vấn viết nó không phải là một vấn đề như vậy, nhưng nếu một người cho rằng bạn chỉ có thể sử dụng backticks, tôi sẽ cho rằng nó cho phép bạn thoát khỏi những thứ lố bịch như

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

Mà tất nhiên tạo ra các bảng có tên xấu.

Nếu bạn chỉ súc tích tôi không thấy vấn đề gì với nó, bạn sẽ lưu ý nếu bạn chạy truy vấn của mình như vậy

EXPLAIN EXTENDED Select foo,bar,baz 

Cảnh báo được tạo trở lại sẽ có dấu tích ngược tên bảng đủ điều kiện. Vì vậy, nếu bạn đang sử dụng các tính năng tạo truy vấn và tự động viết lại các truy vấn, backticks sẽ khiến mọi thứ phân tích mã của bạn bớt bối rối.

Tôi nghĩ tuy nhiên, thay vì bắt buộc liệu bạn có thể sử dụng backticks hay không, họ nên có một tiêu chuẩn cho tên. Nó giải quyết nhiều vấn đề 'thực tế' hơn.


Chúng ta có cần sử dụng chúng trong PostgreSQL không?
Yousuf Memon

5
Không có nhu cầu, chỉ đề nghị. Sẽ rất hữu ích khi đại diện cho chúng được trích dẫn để tránh sự mơ hồ với các từ khóa SQL nếu trong tương lai, một từ khóa SQL được thêm vào chia sẻ tên trường của bạn. Thời gian duy nhất bạn / cần / phải trích dẫn là khi một lĩnh vực không chia sẻ một tên từ khóa, ví dụ, select count from foovs select "count" from foosẽ cho kết quả rất khác nhau. Nhưng postgres khác với mysql theo 2 cách: 1. Các trường được trích dẫn bởi "". 2. Các trường không được trích dẫn là trường hợp không nhạy cảm postgresql.org/docs/civerse/static/
Kent Fredric

57

Vấn đề duy nhất với backticks là chúng không tuân thủ ANSI-SQL, ví dụ: chúng không hoạt động trong SQL Server.

Nếu có cơ hội bạn sẽ phải chuyển SQL của mình sang cơ sở dữ liệu khác, hãy sử dụng dấu ngoặc kép.


15
Vâng. Sử dụng chế độ ANSI của MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - để bật dấu ngoặc kép trong MySQL và do đó lấy lại khả năng tương thích cơ sở dữ liệu chéo. Backticks / trích dẫn cũng cần thiết bởi vì bạn không bao giờ biết những gì sẽ trở thành một từ dành riêng trong các phiên bản DBMS trong tương lai.
bobince

1
Điều đó rất đúng! Một trong những ứng dụng máy chủ của chúng tôi đã chạy tốt cho đến khi chúng tôi áp dụng một bản nâng cấp cho công cụ cơ sở dữ liệu của chúng tôi, đã thêm một từ khóa mới. Đột nhiên mọi thứ truy vấn một bảng cụ thể bị phá vỡ.
Miquella

@bobince Khi tôi chưa quen với dev, tôi đã đặt tên cho một cột rangehoặc đại loại như thế. Khi chúng tôi nâng cấp lên MySQL 5 thì không thành công vì đó là một từ dành riêng mới!
alex

1
Không sử dụng dấu ngoặc kép. Nó sẽ không luôn luôn hoạt động. Chẳng hạn ... XÓA TỪ app_key_storesWHERE ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Truy vấn OK, 0 hàng bị ảnh hưởng (0,00 giây) XÓA TỪ app_key_storesWHERE ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Truy vấn OK, 5 hàng bị ảnh hưởng (0,00 giây)
Altonymous

44

Đối với tôi nó rất có ý nghĩa để sử dụng chúng mọi lúc khi xử lý tên trường.

  • Đầu tiên, một khi bạn đã thành thói quen, sẽ không đau khi chỉ nhấn phím backtick.
  • Thứ hai, với tôi, nó giúp dễ dàng hơn để xem chính xác các trường trong truy vấn của bạn là gì và từ khóa hoặc phương thức là gì.
  • Cuối cùng, nó cho phép bạn sử dụng bất kỳ tên trường nào bạn muốn khi thiết kế bảng của mình. Đôi khi, rất có ý nghĩa khi đặt tên một trường là "khóa", "thứ tự" hoặc "giá trị" ... tất cả đều yêu cầu backticks khi đề cập đến chúng.

19
Bạn cũng nên thêm rằng nó bảo vệ bạn khỏi mọi từ dành riêng trong tương lai đang được sử dụng (đã cắn tôi trước đó).
alex

5
Tôi thực sự đã có ai đó chỉnh sửa các backticks thêm từ một trong những câu hỏi của tôi một lần, điều đó làm tôi khó chịu, vì lý do này là lý do chính xác tôi bao quanh mọi biến số với chúng
Brian Leishman

2
Nó cũng cho phép sử dụng an toàn các nhãn không phải tiếng Anh, chỉ riêng nó đã đủ để khuyến khích việc sử dụng backticks.
Aternus

26

Backticks không phải là một phần của ANSI SQL tiêu chuẩn. Từ hướng dẫn sử dụng mysql :

Nếu chế độ SQL ANSI_QUOTES được bật, bạn cũng có thể trích dẫn định danh trong dấu ngoặc kép

Vì vậy, nếu bạn sử dụng backticks và sau đó quyết định chuyển khỏi MySQL, bạn sẽ gặp vấn đề (mặc dù bạn cũng có thể có nhiều vấn đề lớn hơn)


9

Không có gì sai nếu bạn tiếp tục sử dụng MYSQL, ngoại trừ khả năng trực quan của các truy vấn. Nhưng chúng cho phép sử dụng các từ khóa dành riêng hoặc không gian nhúng làm tên bảng và cột. Điều này là không có với hầu hết các công cụ cơ sở dữ liệu và sẽ ngăn chặn mọi di chuyển sau đó.

Để dễ đọc, nhiều người sử dụng mũ cho các từ khóa SQL, vd.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

Nếu bạn hỏi tôi, backticks nên luôn luôn được sử dụng. Nhưng có một số lý do tại sao một nhóm có thể không thích sử dụng chúng.

Ưu điểm:

  • Sử dụng chúng, không có từ dành riêng hoặc ký tự bị cấm.
  • Trong một số trường hợp, bạn nhận được nhiều thông báo lỗi mô tả hơn.
  • Nếu bạn tránh các thực hành xấu mà bạn không quan tâm, nhưng ... nói một cách thực tế, đôi khi chúng là một cách tốt để tránh tiêm SQL.

Nhược điểm:

  • Chúng không chuẩn và thường không xách tay. Tuy nhiên, miễn là bạn không sử dụng backtick như một phần của mã định danh (đó là cách thực hành tồi tệ nhất tôi có thể tưởng tượng), bạn có thể chuyển truy vấn của mình bằng cách tự động xóa backticks.
  • Nếu một số truy vấn của bạn đến từ Access, họ có thể trích dẫn tên bảng bằng "(và có thể bạn không thể xóa tất cả" một cách mù quáng). Tuy nhiên, hỗn hợp của backticks và dấu ngoặc kép được cho phép.
  • Một số phần mềm hoặc chức năng ngu ngốc lọc các truy vấn của bạn và có vấn đề với backticks. Tuy nhiên, chúng là một phần của ASCII nên điều này có nghĩa là phần mềm / chức năng của bạn rất tệ.

9
Sử dụng backticks hoàn toàn không có gì để tránh việc tiêm SQL.
Andy Lester

6
@andy nó có thể giúp, vì một kẻ tấn công phải đóng nó bằng một backtick khác để tiêm. Nó làm rất ít, nhưng đó vẫn là một cái gì đó
jasonszhao

4

Việc tìm kiếm cơ sở mã của bạn để tìm thứ gì đó trong backticks dễ dàng hơn nhiều. Nói rằng bạn có một bảng được đặt tên event. grep -r "event" *có thể trả lại hàng trăm kết quả. grep -r "\`event\`" *sẽ trả về bất cứ điều gì có thể tham chiếu cơ sở dữ liệu của bạn.


Nói chung nó không thực sự là một lợi ích. Các bảng một cách chuyên nghiệp đi qua được đặt tên giống như new_usftimeinfo hơn là "chung".
ankush981

3

Vâng, theo như tôi biết, toàn bộ mục đích của việc sử dụng backticks là để bạn có thể sử dụng các tên trùng với các từ khóa dành riêng. Vì vậy, nếu tên không va chạm với một từ khóa dành riêng, tôi không thấy bất kỳ lý do nào để sử dụng backticks. Nhưng, đó cũng không phải là lý do để cấm họ.


2

Điều đơn giản về backtick `` được sử dụng để biểu thị định danh như cơ sở dữ liệu, tên_bảng, v.v. và trích dẫn đơn '' , trích dẫn kép "" cho chuỗi ký tự, trong khi "" sử dụng cho giá trị in như hiện tại và '' in biến giá trị giữ hoặc trong trường hợp khác in văn bản của mình có.

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

nếu bạn đang sử dụng một số tên trường làm giá trị mysql hoặc mssql mặc định, ví dụ "trạng thái", bạn phải sử dụng backticks ("select statusfrom tên_bảng" hoặc "chọn id từ tên_bảng trong đó status= 1"). bởi vì mysql trả về lỗi hoặc không hoạt động truy vấn.


0

Việc sử dụng chính của backticks (`) trong SQL là sử dụng chúng trong các tình huống mà bạn sẽ gọi lại chúng trong các mệnh đề sắp tới. Trong mọi thời điểm khác, nên sử dụng dấu ngoặc kép ("").

Ví dụ

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;

Trong câu lệnh trên, bạn có thấy cách Publisher and Locationsử dụng lại trong GROUP BYmệnh đề.

Thay vì sử dụng

NHÓM THEO Tên, thành phố, statecode

Tôi vừa mới sử dụng

NHÓM THEO Publisher and Location

Chỉ khi các tình huống như vậy phát sinh, nó là hữu ích để sử dụng backticks. Trong tất cả các lần khác, sử dụng dấu ngoặc kép được khuyến khích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.