2010-09-16 31 views
35

Trong khi đi qua một số sách SQL tôi thấy rằng các ví dụ có xu hướng sử dụng dấu chấm hỏi (?) trong truy vấn của họ. Nó đại diện cho cái gì?Dấu chấm hỏi biểu thị trong các truy vấn SQL là gì?

+0

Ông có thể cung cấp mã cho truy vấn? – Gage

+0

Tôi đoán đó là các biến trong các câu lệnh đã chuẩn bị, nhưng bạn nên đăng truy vấn cụ thể đó để chắc chắn. – kennytm

+0

@ Mì lúa mì, nó chỉ đơn giản có nghĩa là bạn có thể nhận được sự giúp đỡ từ các thiên tài ở đây khá vui vẻ (nếu bạn cần câu trả lời chuyên gia). –

Trả lời

12

? là thông số chưa đặt tên có thể được điền bởi chương trình chạy truy vấn để tránh SQL injection.

+0

Bạn có thể cung cấp ví dụ về điều này không? – Brad

1

Thông thường nó đại diện cho thông số được cung cấp bởi ứng dụng khách.

2

Đó là thông số. Bạn có thể chỉ định nó khi thực hiện truy vấn.

2

Tôi không nghĩ rằng có bất kỳ ý nghĩa nào trong SQL. Bạn có thể nhìn vào các câu lệnh được chuẩn bị trong JDBC hoặc một cái gì đó. Trong trường hợp đó, dấu hỏi là phần giữ chỗ cho các tham số cho câu lệnh.

5

? là để cho phép Truy vấn tham số. Các truy vấn được tham số hóa này là cho phép giá trị kiểu cụ thể khi thay thế ? bằng giá trị tương ứng của chúng.

Đó là tất cả.

Dưới đây là một số reason lý do tại sao nên sử dụng Truy vấn tham số. Về cơ bản, nó dễ đọc và gỡ lỗi hơn.

65

Những gì bạn thấy là một truy vấn được tham số được tham số hóa. Chúng thường được sử dụng khi thực thi SQL động từ một chương trình.

Ví dụ, thay vì viết này (lưu ý: giả):

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7") 
result = cmd.Execute() 

Bạn viết này:

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?") 
cmd.Parameters.Add(7) 
result = cmd.Execute() 

này có nhiều ưu điểm, như là lẽ hiển nhiên. Một trong những điều quan trọng nhất: các hàm thư viện phân tích các thông số của bạn là thông minh và đảm bảo rằng các chuỗi được thoát đúng cách. Ví dụ: nếu bạn viết thư này:

string s = getStudentName() 
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')" 
cmd.Execute() 

Điều gì xảy ra khi người dùng nhập mã này?

Robert'); DROP TABLE students; -- 

(trả lời là here)

Viết này thay vì:

s = getStudentName() 
cmd.CommandText = "SELECT * FROM students WHERE name = ?" 
cmd.Parameters.Add(s) 
cmd.Execute() 

Sau đó, thư viện sẽ khử trùng đầu vào, sản xuất này:

"SELECT * FROM students where name = 'Robert''); DROP TABLE students; --'" 

Không phải tất cả của DBMS sử dụng ?. MS SQL sử dụng tên thông số, mà tôi xem xét một sự cải thiện rất lớn :

cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname" 
cmd.Parameters.AddWithValue("@varname", 7) 
result = cmd.Execute() 
+1

Câu trả lời rất rõ ràng thể hiện các ví dụ và lựa chọn thay thế. Cảm ơn bạn. – Termato

+8

Cộng một cho phim hoạt hình hài hước – CHarris

+0

Điểm tuyệt vời về các tham số có tên MS SQL. – myidealab

Các vấn đề liên quan