Làm cách nào để thoát dấu nháy đơn (') trong MySql?


146

Các tài liệu MySQL nói rằng nó nên được \'. Tuy nhiên, cả scite và mysql đều cho thấy ''hoạt động. Tôi đã thấy điều đó và nó hoạt động. Tôi nên làm gì?


Bạn đang nói về việc có ''hay \'không?
Raptor

\'là đặc thù của MySQL trong khi ''tuân thủ ANSI SQL nếu tôi không nhầm
apokryfos

Tùy thuộc vào việc triển khai SQL; - '' \ '', '\' 'và đôi khi' [']' 'sẽ cho phép thoát ra khỏi mã. Trên hết, bất kỳ số lần thay thế nào của unicode sẽ bỏ qua kiểm tra này. Toàn bộ trò chơi ở đây đang lạm dụng chất lượng của việc thoát dựa trên '' mà nó yêu cầu số cuối cùng 'phải chẵn hơn là lẻ. Nếu nó kết thúc kỳ lạ bằng cách trộn nhiều phương thức thoát vào nhau, bạn có thể đánh bại việc thoát và tiêm SQL thô. Đạo đức của câu chuyện: KHÔNG BAO GIỜ sử dụng phép nội suy chuỗi, LUÔN LUÔN sử dụng các câu lệnh đã chuẩn bị.
Shayne

Câu trả lời:


185

Tài liệu MySQL mà bạn trích dẫn thực sự nói nhiều hơn một chút so với bạn đề cập. Nó cũng nói,

Một phạm vi phạm lỗi 'bên trong một chuỗi được trích dẫn với phạm lỗi 'có thể được viết là ''hung phạm.

(Ngoài ra, bạn đã liên kết với phiên bản MySQL 5.0 của Bảng 8.1. Trình tự thoát ký tự đặc biệt và phiên bản hiện tại là 5.6 - nhưng Bảng 8.1 hiện tại . Trình tự thoát ký tự đặc biệt trông khá giống nhau.)

Tôi nghĩ rằng ghi chú Postgres trên backslash_quote (string)tham số là thông tin:

Điều này kiểm soát xem một dấu ngoặc kép có thể được biểu diễn bằng \'một chuỗi bằng chữ hay không. Cách ưa thích, tiêu chuẩn SQL để biểu thị dấu ngoặc kép là nhân đôi nó ( '') nhưng PostgreQuery trong lịch sử cũng đã được chấp nhận \'. Tuy nhiên, việc sử dụng \'tạo ra rủi ro bảo mật ...

Điều đó nói với tôi rằng sử dụng một ký tự trích dẫn kép là một lựa chọn tổng thể và dài hạn tốt hơn so với sử dụng dấu gạch chéo ngược để thoát khỏi trích dẫn đơn.

Bây giờ nếu bạn cũng muốn thêm lựa chọn ngôn ngữ, lựa chọn cơ sở dữ liệu SQL và các yêu cầu không chuẩn của nó và lựa chọn khung truy vấn vào phương trình, thì bạn có thể kết thúc bằng một lựa chọn khác. Bạn không cung cấp nhiều thông tin về các ràng buộc của bạn.


42

SQL chuẩn sử dụng dấu ngoặc kép; MySQL phải chấp nhận điều đó để tuân thủ hợp lý.

'He said, "Don''t!"'

+1. Nơi nào nó nói rằng nó nên được thoát bởi '' chứ không phải dev.mysql.com/doc/refman/5.0/en/ Kẻ
user4951

Nó nói 'có thể' chứ không phải 'nên', nhưng thông tin là có (bên dưới bảng): Có một số cách để bao gồm ký tự quote trong một chuỗi: A “ '” bên trong một chuỗi trích dẫn với “ '” có thể được viết như sau “ ''” . Một phạm vi phạm lỗi "bên trong một chuỗi được trích dẫn với phạm lỗi "có thể được viết là ""hung phạm. Đặt trước ký tự trích dẫn bởi một ký tự thoát (`` `).
Jonathan Leffler

1
Đây là cách tốt nhất để thoát khỏi dấu nháy đơn bằng cách nhân đôi nó.
Alex _TNT

10

Những gì tôi tin user2087510 có nghĩa là:

name = 'something'
name = name.replace("'", "\\'")

Tôi cũng đã sử dụng điều này với thành công.


1
Làm việc cho tôi trong khi những câu trả lời hàng đầu thì không
Jared

1
tại sao \ 'chứ không phải \'?
biniam

@biniam_Ethiopia thứ hai \ thoát khỏi cái thứ nhất
Juha Untinen

2
vấn đề bảo mật có thể. có thể được tiêm sql nếu chuỗi đã chứa \ ', vì vậy bạn chèn một \, hiện đang ở trong chuỗi dưới dạng \' sẽ chấm dứt chuỗi. Thay vào đó, hãy sử dụng name.replace ("'", "' '")
Garr Godfrey

6

chỉ cần viết ''thay cho 'tôi có nghĩa là hai lần'


1
sử dụng dấu nháy hai lần thay cho một lần
MRRaja

5

Đây là một ví dụ:

SELECT * FROM pubs WHERE name LIKE "%John's%"

Chỉ cần sử dụng dấu ngoặc kép để kèm theo trích dẫn duy nhất.

Nếu bạn khăng khăng sử dụng dấu ngoặc đơn (và nhu cầu thoát ký tự):

SELECT * FROM pubs WHERE name LIKE '%John\'s%'

4

Có ba cách tôi nhận thức được. Cách thứ nhất không phải là đẹp nhất và thứ hai là cách phổ biến trong hầu hết các ngôn ngữ lập trình:

  1. Sử dụng một trích dẫn khác: 'I mustn''t sin!'
  2. Sử dụng ký tự thoát \trước dấu ngoặc đơn ':'I mustn\'t sin!'
  3. Sử dụng dấu ngoặc kép để đính kèm chuỗi thay vì dấu ngoặc đơn: "I mustn't sin!"

Sở thích cá nhân của tôi sẽ được \'sử dụng bởi rất nhiều ngôn ngữ lập trình, nhưng ''được hỗ trợ bởi nhiều phương ngữ SQL hơn, vì vậy sử dụng tùy chọn 1 sẽ tốt hơn cho khả năng tương thích. Sqlite chẳng hạn không hoạt động với các dấu gạch chéo ngược.
okdewit

0

Thay thế chuỗi

value = value.replace(/'/g, "\\'");

trong đó giá trị là chuỗi của bạn sẽ lưu trữ trong Cơ sở dữ liệu của bạn.

Thêm nữa,

Gói NPM cho điều này, bạn có thể xem xét nó

https://www.npmjs.com/package/mysql-apostrophe


Xin đừng chỉ đăng một số công cụ hoặc thư viện như một câu trả lời. Ít nhất là chứng minh làm thế nào nó giải quyết vấn đề trong chính câu trả lời.
Baum mit Augen

Điều đó sẽ không đi làm. Bạn quên thoát khỏi mọi thứ. thay thế (/ \ '/ g, "\\\'")
Michael

0

Tôi nghĩ rằng nếu bạn có bất kỳ điểm dữ liệu nào với dấu nháy đơn, bạn có thể thêm một dấu nháy đơn trước dấu nháy đơn

ví dụ. "Đây là nơi của John"

Ở đây MYSQL giả sử hai câu 'Đây là nơi của John'

Bạn có thể đặt 'Đây là nơi của John'. Tôi nghĩ rằng nó nên làm việc theo cách đó.



0

Có thể lạc đề, nhưng có lẽ bạn đến đây để tìm cách vệ sinh văn bản nhập từ một biểu mẫu HTML, để khi người dùng nhập ký tự dấu nháy đơn, nó sẽ không xuất hiện lỗi khi bạn cố gắng viết văn bản vào SQL bảng dựa trên DB. Có một số cách để làm điều này và bạn cũng có thể muốn đọc về SQL SQL, nhưng một tùy chọn đơn giản trong PHP là sử dụng hàm htmlspecialchars () sẽ chuyển đổi tất cả các dấu nháy đơn của bạn thành 'thứ bạn có thể lưu trữ dù sao.


Mã hóa không phải để lưu trữ, nó là để hiển thị. Sử dụng báo cáo chuẩn bị.
mickmackusa

Tôi đồng ý rằng các tuyên bố được chuẩn bị là tiêu chuẩn vàng về bảo mật và độ tin cậy. Tôi đã nhấn mạnh một trường hợp cụ thể trong đó bạn có thể muốn lưu trữ dữ liệu văn bản dưới dạng HTML, trong trường hợp đó phương pháp của tôi ngoài việc sử dụng các tham số ràng buộc, thay vì thay vì. HTML trong, HTML ra.
Grindlay
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.