จะหลีกเลี่ยง apostrophe (') ใน MySql ได้อย่างไร


147

เอกสาร MySQL\'บอกว่ามันควรจะเป็น อย่างไรก็ตามทั้ง scite และ mysql แสดงให้เห็นว่าใช้''งานได้ ฉันเห็นสิ่งนั้นและมันใช้งานได้ ฉันควรทำอย่างไรดี?


คุณกำลังพูดถึง''หรือ\'ไม่ถูกต้อง?
Raptor

\'เป็น MySQL เฉพาะในขณะที่''เป็นไปตามมาตรฐาน ANSI SQL ถ้าฉันไม่ผิด
apokryfos

ขึ้นอยู่กับการใช้งานของ SQL - '' \ '', '\' 'และบางครั้ง' [']' 'จะช่วยให้แยกออกจากรหัส นอกเหนือจากนี้การเปลี่ยนยูนิโค้ดจำนวนใดก็ตามจะผ่านการตรวจสอบนี้ เกมทั้งหมดที่นี่กำลังละเมิดคุณภาพของ '' การหลบหนีที่มีพื้นฐานว่าจะต้องมีการนับรอบชิงชนะเลิศ 'ถึงแม้ว่าจะไม่ใช่เรื่องแปลก ถ้ามันจบลงด้วยวิธีการหลายวิธีที่แตกต่างกันคุณสามารถเอาชนะการหลบหนีและการฉีด SQL ดิบ คุณธรรมของเรื่องราว: ไม่เคยใช้การแก้ไขสตริงเสมอเคยใช้งบเตรียม
เชน

คำตอบ:


186

เอกสาร MySQL ที่คุณอ้างถึงจริง ๆ แล้วพูดมากกว่าที่คุณพูดถึง มันยังบอกว่า

'” ภายในสตริงที่ยกมาด้วย“ '” อาจเขียนเป็น“ ''

(นอกจากนี้คุณเชื่อมโยงไปยังMySQL เวอร์ชัน 5.0 ของตารางที่ 8.1 ตัวละครพิเศษ Escape Sequencesและเวอร์ชันปัจจุบันคือ 5.6 - แต่ตารางที่ 8.1ในปัจจุบันตัวละครพิเศษ Escape Sequencesดูคล้ายกันมาก)

ฉันคิดว่าบันทึก Postgres ในbackslash_quote (string)พารามิเตอร์เป็นข้อมูล:

สิ่งนี้จะควบคุมว่าเครื่องหมายคำพูดสามารถแสดงด้วย\'ตัวอักษรในสตริงได้หรือไม่ วิธีมาตรฐาน SQL ที่ต้องการเพื่อแสดงเครื่องหมายคำพูดคือการเพิ่มขึ้นสองเท่า ( '') แต่ PostgreSQL ได้รับการยอมรับในอดีต\'ด้วย อย่างไรก็ตามการใช้\'สร้างความเสี่ยงด้านความปลอดภัย ...

ที่บอกกับฉันว่าการใช้อักขระเครื่องหมายคำพูดเดี่ยวสองเท่าเป็นตัวเลือกโดยรวมและระยะยาวที่ดีกว่าการใช้เครื่องหมายทับขวาเพื่อหลบหนีเครื่องหมายคำพูดเดี่ยว

ตอนนี้ถ้าคุณต้องการเพิ่มทางเลือกของภาษาทางเลือกของฐานข้อมูล SQL และ quirks ที่ไม่ได้มาตรฐานและทางเลือกของเคียวรีเฟรมเวิร์กในสมการคุณอาจสิ้นสุดด้วยตัวเลือกอื่น คุณไม่ได้ให้ข้อมูลมากนักเกี่ยวกับข้อ จำกัด ของคุณ


42

SQL มาตรฐานใช้เครื่องหมายคำพูดขึ้นสองเท่า MySQL ต้องยอมรับว่าเป็นไปตามความสมเหตุสมผล

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

+1 มันอยู่ที่ไหนบอกว่ามันควรจะหนีโดย '' ไม่dev.mysql.com/doc/refman/5.0/en/ …
4951

มันบอกว่า 'อาจ' มากกว่า 'ควร' แต่ข้อมูลมี (ใต้ตาราง): มีหลายวิธีในการรวมอักขระเครื่องหมายคำพูดในสตริง: " '" ภายในสตริงที่ยกมาด้วย " '" อาจเขียนเป็น " ''" . “ "” ภายในสตริงที่ยกมาด้วย“ "” อาจเขียนเป็น“ ""” นำหน้าอักขระเครื่องหมายคำพูดโดยอักขระเลี่ยง ("` `")
Jonathan Leffler

1
นี่เป็นวิธีที่ดีที่สุดในการหลบหนี apostrophe โดยเพิ่มเป็นสองเท่า
อเล็กซ์ _TNT

10

สิ่งที่ฉันเชื่อว่า user2087510 หมายถึงคือ:

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

ฉันเคยใช้สิ่งนี้ด้วยความสำเร็จ


1
ทำงานให้ฉันในขณะที่คำตอบยอดนิยมเหล่านั้นไม่ได้
Jared

1
ทำไม \\ 'มากกว่า \'
biniam

@biniam_ เอธิโอเปียที่สอง \ หนีคนแรก
Juha Untinen

2
ปัญหาความปลอดภัยที่เป็นไปได้ สามารถรับการฉีด sql ได้ถ้าสตริงมี \ 'อยู่แล้วดังนั้นคุณจึงใส่ \ ซึ่งตอนนี้อยู่ในสตริงเป็น \\' ซึ่งจะยุติสตริง ใช้ name.replace ("'", "' '") แทน
Garr Godfrey

6

แค่เขียน''แทน'ฉันหมายถึงสองครั้ง'


1
ใช้เครื่องหมายอะโพสโทรฟีสองครั้งในสถานที่แห่งหนึ่ง
MRRaja

5

นี่คือตัวอย่าง:

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

เพียงใช้เครื่องหมายคำพูดคู่เพื่อใส่เครื่องหมายคำพูดเดี่ยว

หากคุณยืนยันในการใช้เครื่องหมายคำพูดเดี่ยว (และความจำเป็นในการหลีกเลี่ยงอักขระ):

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

4

มีสามวิธีที่ฉันรู้ คนแรกไม่ได้เป็นคนที่สวยที่สุดและคนที่สองเป็นคนธรรมดาในภาษาการเขียนโปรแกรมส่วนใหญ่:

  1. ใช้เครื่องหมายคำพูดเดี่ยวอีกอัน: 'I mustn''t sin!'
  2. ใช้อักขระ escape \ก่อนเครื่องหมายคำพูดเดี่ยว':'I mustn\'t sin!'
  3. ใช้เครื่องหมายคำพูดคู่เพื่อใส่สตริงแทนเครื่องหมายคำพูดเดี่ยว: "I mustn't sin!"

การตั้งค่าส่วนตัวของฉันจะเป็น\'เหมือนที่ใช้โดยภาษาการเขียนโปรแกรมจำนวนมาก แต่''ได้รับการสนับสนุนโดยภาษา SQL เพิ่มเติมดังนั้นการใช้ตัวเลือก 1 จะดีกว่าสำหรับความเข้ากันได้ ตัวอย่างเช่น Sqlite ไม่สามารถใช้กับเครื่องหมายแบคสแลชได้
okdewit

0

แทนที่สตริง

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

โดย value คือสตริงของคุณที่จะจัดเก็บในฐานข้อมูลของคุณ

เพิ่มเติม

แพคเกจ NPM สำหรับสิ่งนี้คุณสามารถดูได้

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


โปรดอย่าเพิ่งโพสต์เครื่องมือหรือห้องสมุดเพื่อเป็นคำตอบ อย่างน้อยก็แสดงให้เห็นว่ามันแก้ปัญหาในคำตอบของตัวเอง
Baum mit Augen

นั่นจะไม่ทำงาน คุณลืมที่จะหลบหนีสิ่งต่าง ๆ แทนที่ (/ \ '/ g, "\\\'")
Michael

0

ฉันคิดว่าถ้าคุณมีจุดข้อมูลที่มีเครื่องหมายอะโพสโทรฟีคุณสามารถเพิ่มอะพอสโทรฟีหนึ่งอันต่อหน้าอะพอสโทรฟีได้

เช่น. 'นี่คือสถานที่ของจอห์น'

ที่นี่ MySQL คิดสองประโยค 'นี่คือสถานที่ของจอห์น'

คุณสามารถใส่ 'นี่คือสถานที่ของจอห์น' ฉันคิดว่ามันควรจะทำงานอย่างนั้น



0

อาจเป็นหัวข้อนอกเรื่อง แต่คุณอาจมาที่นี่เพื่อหาวิธีในการฆ่าเชื้อการป้อนข้อความจากรูปแบบ HTML ดังนั้นเมื่อผู้ใช้ป้อนอักขระอะโพสโทรฟีมันจะไม่เกิดข้อผิดพลาดเมื่อคุณพยายามเขียนข้อความไปยัง SQL ตารางที่ใช้ในฐานข้อมูล มีสองวิธีในการทำเช่นนี้และคุณอาจต้องการอ่านเกี่ยวกับการฉีด SQL ด้วยเช่นกัน แต่ตัวเลือกง่ายๆใน PHP คือการใช้ฟังก์ชั่นhtmlspecialchars ()ซึ่งจะแปลง apostrophes ทั้งหมดของคุณ'ซึ่งอาจเป็นสิ่งที่คุณต้องการจัดเก็บ อย่างไรก็ตาม.


การเข้ารหัสไม่ได้มีไว้สำหรับการจัดเก็บ แต่ใช้สำหรับแสดงผล ใช้งบเตรียม
mickmackusa

ฉันยอมรับว่าข้อความที่เตรียมเป็นมาตรฐานทองคำสำหรับความปลอดภัยและความน่าเชื่อถือ ฉันกำลังเน้นกรณีเฉพาะที่คุณอาจต้องการเก็บข้อมูลข้อความเป็น HTML ซึ่งในกรณีนี้วิธีการของฉันคือนอกเหนือจากการใช้พารามิเตอร์ที่ถูกผูกไว้แทนที่จะเป็น HTML เข้า, ออก HTML
Grindlay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.