Làm cách nào để chèn một giá trị có dấu nháy đơn (trích dẫn đơn)?


310

Cú pháp SQL chính xác để chèn một giá trị với dấu nháy đơn trong đó là gì?

Insert into Person
  (First, Last)
Values
  'Joe',
  'O'Brien'

Tôi tiếp tục nhận được một lỗi vì tôi nghĩ dấu nháy đơn sau chữ O là thẻ kết thúc cho giá trị.


16
Vui lòng xác nhận rằng bạn không tự mở các cuộc tấn công SQL SQL. Sử dụng các tham số khi có thể.
Andrew

Bạn đang sử dụng ngôn ngữ kịch bản nào? Có các hàm trong PHP, ví dụ, để làm điều này một cách chính xác cho bạn.
philfreo

Đồng ý với Andrew ở đây: Tôi hy vọng câu hỏi này chỉ liên quan đến việc chạy SQL thông qua máy khách SQL hoặc "trình duyệt truy vấn" hoặc như vậy và không thực sự ở đâu đó trong mã sản xuất. Không sử dụng các câu lệnh tham số là hoàn toàn.
charstar

nó thực sự nằm trong mã .. nếu tôi có một truy vấn được tham số hóa thì tôi có phải làm điều tương tự không?
leora

2
Tiêu cực. Tùy thuộc vào cơ sở dữ liệu và trình điều khiển bạn đang sử dụng, việc cách ly các tham số có thể được xử lý khác nhau, nhưng các tham số trong câu lệnh được tham số hóa không yêu cầu thoát. Xem en.wikipedia.org/wiki/Query_injection#Preventing_Query_injection
charstar

Câu trả lời:


485

Thoát dấu nháy đơn (nghĩa là nhân đôi ký tự trích dẫn) trong SQL của bạn:

INSERT INTO Person
    (First, Last)
VALUES
    ('Joe', 'O''Brien')
              /\
          right here  

Điều tương tự cũng áp dụng cho các truy vấn CHỌN:

SELECT First, Last FROM Person WHERE Last = 'O''Brien'

Dấu nháy đơn, hoặc trích dẫn đơn, là một ký tự đặc biệt trong SQL chỉ định phần đầu và phần cuối của dữ liệu chuỗi. Điều này có nghĩa là để sử dụng nó như một phần của dữ liệu chuỗi ký tự của bạn, bạn cần escapeký tự đặc biệt. Với một trích dẫn, điều này thường được thực hiện bằng cách nhân đôi trích dẫn của bạn. (Hai ký tự trích dẫn đơn, không phải trích dẫn kép thay vì một trích dẫn.)

Lưu ý : Bạn chỉ nên lo lắng về vấn đề này khi bạn chỉnh sửa dữ liệu theo cách thủ công thông qua giao diện SQL thô vì việc viết các truy vấn bên ngoài quá trình phát triển và thử nghiệm sẽ rất hiếm khi xảy ra. Trong mã có các kỹ thuật và khung (tùy thuộc vào ngăn xếp của bạn) đảm nhiệm việc thoát các ký tự đặc biệt, SQL SQL , v.v.


6
$ linkQuestion = str numplace ("'", "' '", $ linkQuestion); (trời ơi thật khó đọc!)
user462990

Điều gì xảy ra nếu dữ liệu được Chèn vào Người (Đầu tiên, Cuối cùng) Giá trị 'Joe', 'Cửa hàng của Cha'.
vijesh

37

Bạn chỉ cần tăng gấp đôi trên các dấu ngoặc đơn ...

insert into Person (First, Last)
values ('Joe', 'O''Brien')

21

Bạn cần phải thoát khỏi dấu nháy đơn. Trong T-SQL, đây là dấu nháy đơn, vì vậy insertcâu lệnh của bạn trở thành:

Insert into Person
(First, Last)
Values
'Joe', 'O''Brien'

AFAIK Valuesphải được đặt trong niềng răng (sau đó trả lời giống như câu trả lời của @JustinNiessner)
qwerty_so

15

Bởi vì một trích dẫn được sử dụng để chỉ sự bắt đầu và kết thúc của một chuỗi; bạn cần phải thoát khỏi nó

Câu trả lời ngắn gọn là sử dụng hai dấu ngoặc đơn - ''- để cơ sở dữ liệu SQL lưu trữ giá trị dưới dạng '.

Nhìn vào việc sử dụng REPLACE để vệ sinh các giá trị đến:

Bạn muốn kiểm tra ''''và thay thế chúng nếu chúng tồn tại trong chuỗi ''''''để thoát khỏi trích dẫn đơn lẻ.


3

eduffy đã có một ý tưởng tốt . Anh ta chỉ nhận được nó ngược trong ví dụ mã của mình. Trong JavaScript hoặc SQLite, bạn có thể thay thế dấu nháy đơn bằng ký hiệu dấu.

Anh ấy (vô tình tôi chắc chắn) đã đặt biểu tượng dấu làm dấu phân cách cho chuỗi thay vì thay thế dấu nháy đơn trong O'Brian. Đây thực sự là một giải pháp cực kỳ đơn giản cho hầu hết các trường hợp.


Giải pháp tuyệt vời và đơn giản hơn nhiều và tên cuối cùng của tôi là O`Reilly!
PhillipOReilly

Dù sao cũng nên sử dụng các ký tự thoát. Vô tình :) kể từ ngày tôi đang sử dụng bàn phím. Tôi đang vô tình sử dụng biểu tượng dấu thay cho dấu ngoặc đơn trong khi viết tài liệu. (tuy nhiên trong mã tôi sử dụng 'làm định danh char). Cho đến năm ngoái khi ai đó nói với tôi mật khẩu của anh ấy và tôi không thể đăng nhập vào hệ thống của anh ấy. chúng tôi không thể tìm ra cho đến khi tôi gõ 'như `.
Học viên

3

Ký tự dấu nháy đơn có thể được chèn bằng cách gọi hàm CHAR với giá trị tra cứu bảng ASCII của dấu nháy đơn , 39. Các giá trị chuỗi sau đó có thể được nối với nhau bằng toán tử ghép .

Insert into Person
  (First, Last)
Values
  'Joe',
  concat('O',char(39),'Brien')

2

Dấu ngoặc đơn được thoát bằng cách nhân đôi chúng lên ,

SQL sau đây minh họa chức năng này.

declare @person TABLE (
    [First] nvarchar(200),
    [Last] nvarchar(200)
)

insert into @person 
    (First, Last)
values
    ('Joe', 'O''Brien')

select * from @person

Các kết quả

First   | Last
===================
Joe     | O'Brien

0

sử dụng dấu ngoặc kép xung quanh các giá trị.

insert into Person (First, Last) Values("Joe","O'Brien")

3
Lưu ý rằng đây không phải là SQL tiêu chuẩn nữa, mặc dù tôi biết Informix, để đặt tên nhưng một DBMS, cho phép nó. Bạn cũng nên giải quyết cách bạn chèn một chuỗi như He said, "Don't!"sử dụng dấu ngoặc đơn và / hoặc dấu ngoặc kép - có thể được thực hiện: 'He said, "Don''t!"'hoặc "He said, ""Don't!""". Khi thêm câu trả lời mới cho câu hỏi đã có từ lâu với câu trả lời được chấp nhận, bạn phải cung cấp thông tin mới, đầy đủ. Sử dụng dấu ngoặc kép là mới - nhưng giới hạn trong một vài DBMS; bạn nên chịu khó xác định ít nhất một trong số những người chấp nhận chúng.
Jonathan Leffler

-1

Thay vào đó, sử dụng backtick (trên phím ~);

`O'Brien`

1
Sau đó, vấn đề trở thành: làm thế nào để chèn một backtick?
Jasper de Vries

1
Mặc dù đây không phải là câu trả lời "đúng", tôi đang làm việc với một tập hợp các tên không có điều này và tôi đang thực hiện một thao tác, vì vậy điều này ngay lập tức giải quyết vấn đề của tôi. Cảm ơn!
nscalf
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.