ฉันจะหลีกเลี่ยงคำพูดเดียวใน SQL Server ได้อย่างไร


956

ฉันกำลังพยายามหาinsertข้อมูลตัวอักษรลงในตารางที่SQL Server9

ข้อความประกอบด้วยเครื่องหมายคำพูดเดี่ยว (')

ฉันจะหนีได้อย่างไร

ฉันพยายามใช้สองคำพูดเดียว แต่มันทำให้ฉันมีข้อผิดพลาด

เช่น. insert into my_table values('hi, my name''s tim.');


30
"มันทำให้ฉันมีข้อผิดพลาด" - อะไรคือข้อผิดพลาดเหล่านี้?
llamaoo7

ใช่เพราะวิธีที่ถูกต้องในการแทรกเครื่องหมายคำพูดเดี่ยวใน MSSQL ก็คือการเพิ่มเป็นสองเท่า ตัวอย่างที่คุณแสดงให้เราเห็นควรจะใช้งานได้ คุณสร้างแบบสอบถาม SQL นี้ด้วยภาษาใด หรือมันอยู่ใน SQL Server Management Studio?
MaxiWheat

1
ซ้ำเป็นไปได้ของการเปลี่ยนราคาเดียวใน SQL Server
Peter Mortensen

คำตอบ:


1388

การเสนอราคาเดี่ยวจะถูกหลีกเลี่ยงโดยเพิ่มขึ้นเป็นสองเท่าเช่นเดียวกับที่คุณแสดงให้เราเห็นในตัวอย่างของคุณ SQL ต่อไปนี้แสดงฟังก์ชันการทำงานนี้ ฉันทดสอบใน SQL Server 2008:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

ผล

value
==================
hi, my name's tim.

16
ฉันดูที่ผิดที่เพื่อแก้ไขปัญหาของฉัน มันไม่ได้เป็นปัญหาการหลบหนีของตัวละครหลังจากทั้งหมด ปัญหาของฉันคือความยาวของข้อมูลเกินขีด จำกัด ขอบคุณที่ให้ความมั่นใจกับฉันว่าการใช้คำพูดเดี่ยวสองครั้งเป็นวิธีที่ถูกต้องในการหลีกหนีจากตัวละคร
tim_wonil

ดังนั้นถ้าฉันมีข้อความที่มี 10k คำฉันจำเป็นต้องแทนที่ข้อความทั้งหมดหรือไม่
Vinicius Lima

3
@ViniciusLima: คำตอบสั้น ๆ คือใช่ แน่นอนว่ามันจะเปลี่ยนไปตามเทคโนโลยีที่คุณใช้ในการเก็บข้อมูล หากคุณใช้ ORM มันจะทำเพื่อคุณ หากคุณกำลังสร้างคำสั่ง SQL ด้วยตนเองคุณจะต้องใช้ฟังก์ชัน "เตรียมคำสั่ง" ของภาษา หากคุณกำลังทำอยู่ใน Management Studio คุณจะต้องทำการแทนที่
Cᴏʀʏ

1
เช่นสองคำพูดเดียวสำหรับหนึ่ง [''] => [']
Ujjwal Singh เมื่อ

67

หากการหลีกเลี่ยงการอ้างคำพูดเดี่ยวด้วยคำพูดเดียวไม่ได้ผลสำหรับคุณ (ไม่เหมือนกับการREPLACE()สอบถามล่าสุดของฉัน) คุณสามารถใช้SET QUOTED_IDENTIFIER OFFก่อนการสืบค้นจากนั้นSET QUOTED_IDENTIFIER ONหลังจากการสอบถาม

ตัวอย่างเช่น

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
ปกติฉันจะใช้วิธีเพิ่มขึ้นเป็นสองเท่า แต่เมื่อฉันสร้าง SQL แบบไดนามิกซึ่งวิ่งข้ามเซิร์ฟเวอร์และฐานข้อมูลหลายตัวโซลูชันนี้ใช้งานได้สำหรับฉันในขณะที่การเสแสร้งไม่ได้อยู่ในกรณีเดียว ขอบคุณสำหรับสิ่งนี้!
Richard Moss

ระวังเมื่ออ้างอิงมุมมองและดัชนีในคอลัมน์ที่คำนวณหรือคุณอาจได้รับข้อผิดพลาด stackoverflow.com/questions/9235527/…
datagod

@RichardMoss, +1 สถานการณ์เดียวกันกับคุณ วิธีการสองเท่าขึ้นเป็นวิธีการแก้ปัญหาเบื้องต้น สำหรับเคียวรีที่ซับซ้อนเช่น SQL แบบไดนามิกในหลายเซิร์ฟเวอร์วิธีนี้จะใช้งานได้และไม่สามารถเพิ่มวิธีการได้สองเท่า
Edgar Allan Bayron


17

การเสนอราคาเพิ่มขึ้นเป็นสองเท่าควรจะได้ผลดังนั้นจึงเป็นเรื่องแปลกประหลาดที่ไม่ได้ผลสำหรับคุณ อย่างไรก็ตามทางเลือกคือการใช้อักขระเครื่องหมายคำพูดคู่แทนที่จะใช้ตัวอักษรเดี่ยวล้อมรอบสตริง กล่าวคือ

insert into my_table values("hi, my name's tim.");


4
จะทำอย่างไรถ้าข้อความนั้นมีทั้งเครื่องหมายคำพูดเดี่ยวและคู่? นอกจากนี้ยังไม่ได้สงวนเครื่องหมายคำพูดคู่สำหรับชื่อฟิลด์เท่านั้นหรือ
Lajos Meszaros

11

2 วิธีในการหลีกเลี่ยงปัญหานี้:


สำหรับ'คุณสามารถเพิ่มเป็นสองเท่าในสตริงเช่น select 'I''m happpy'- จะได้รับ:I'm happy


สำหรับตัวอักษรใด ๆ ที่คุณไม่แน่ใจ: ใน sql server คุณสามารถรับ unicode ของถ่านโดย select unicode(':') (คุณเก็บหมายเลข)

ดังนั้นกรณีนี้คุณสามารถ select 'I'+nchar(39)+'m happpy'


6

สิ่งที่ต้องระวังอีกอย่างคือมันถูกเก็บไว้ในรูปแบบ ASCII '(ASCII 27) หรือ Unicode 2019 (ซึ่งมีลักษณะคล้ายกัน แต่ไม่เหมือนกัน) หรือไม่

นี่ไม่ใช่เรื่องใหญ่สำหรับเม็ดมีด แต่อาจหมายถึงโลกที่เลือกและอัพเดต
หากเป็นค่ายูนิโค้ดให้หลีกเลี่ยงการ 'ในส่วนคำสั่ง WHERE (เช่นเมื่อ blah =' คอมพ์ของคนงาน ') จะกลับมาเหมือนค่าที่คุณกำลังค้นหาไม่ได้อยู่ที่นั่นถ้า' ใน 'คอมพ์ของคนงาน' เป็นจริง ค่า Unicode

หากแอปพลิเคชันไคลเอนต์ของคุณรองรับคีย์ฟรีเช่นเดียวกับการคัดลอกและวางตามอินพุตอาจเป็น Unicode ในบางแถวและ ASCII ในที่อื่น ๆ !

วิธีง่ายๆในการยืนยันการทำเช่นนี้คือการทำคิวรีแบบปลายเปิดซึ่งจะนำค่าที่คุณค้นหากลับมาแล้วคัดลอกและวางลงในแผ่นจดบันทึก ++ หรือบรรณาธิการที่สนับสนุนยูนิโค้ดอื่น ๆ

ลักษณะที่แตกต่างกันระหว่างค่า ascii และ unicode ควรเห็นได้ชัดในสายตา แต่ถ้าคุณเอนไปทางทวารหนักมันจะแสดงเป็น 27 (ascii) หรือ 92 (unicode) ในโปรแกรมแก้ไข hex


4

พวกเราหลายคนรู้ว่าวิธีการที่ได้รับความนิยมในการหลบหนีราคาเดียวคือการทำให้พวกเขาเป็นสองเท่าได้อย่างง่ายดายเช่นด้านล่าง

PRINT 'It''s me, Arul.';

เพิ่มทวีคูณของวิธีการเสนอราคาเดียว

เราจะดูวิธีอื่น ๆ ของการหลีกเลี่ยงคำพูดเดียว

1. ตัวอักษร UNICODE

39 คืออักขระ UNICODE ของ Single Quote ดังนั้นเราสามารถใช้มันเหมือนด้านล่าง

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

อักขระ UNICODE

2.QUOTED_IDENTIFIER

โซลูชันทางเลือกอื่นที่ง่ายและดีที่สุดคือการใช้ QUOTED_IDENTIFIER เมื่อ QUOTED_IDENTIFIER ถูกตั้งค่าเป็นปิดสตริงสามารถอยู่ในเครื่องหมายคำพูดคู่ได้ ในสถานการณ์นี้เราไม่จำเป็นต้องหลีกเลี่ยงคำพูดเดียว ดังนั้นวิธีนี้จะมีประโยชน์มากในขณะที่ใช้ค่าสตริงจำนวนมากด้วยเครื่องหมายคำพูดเดี่ยว มันจะมีประโยชน์มากในขณะที่ใช้สคริปต์ INSERT / UPDATE จำนวนมากที่มีค่าคอลัมน์ที่มีเครื่องหมายคำพูดเดี่ยว

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

สรุปผลการศึกษา

วิธีการดังกล่าวข้างต้นสามารถใช้ได้กับทั้ง AZURE และ On Premises


1

ไวยากรณ์ต่อไปนี้จะยกเว้นคุณเพียงหนึ่งเครื่องหมายคำพูด:

SELECT ''''

ผลลัพธ์จะเป็นคำพูดเดียว อาจมีประโยชน์มากสำหรับการสร้างไดนามิก SQL :) ป้อนคำอธิบายรูปภาพที่นี่



0

เพียงแค่ใส่ 'ก่อนที่จะใส่อะไรก็ได้ มันจะเป็นเหมือนตัวละครหลบหนีใน sqlServer

ตัวอย่าง: เมื่อคุณมีสนามเป็นผมสบายดี คุณสามารถทำได้: อัปเดต my_table SET row = 'ฉันสบายดี';


ไม่ว่าสิ่งที่ OP ทำและสิ่งเดียวกันกับคำตอบที่ได้รับคะแนนสูงสุดพูดแล้ว? สันนิษฐานว่าน่าจะมีแหล่งที่มาของข้อผิดพลาดอื่น ๆ
Michael MacAskill

-2

สิ่งนี้น่าจะใช้ได้: ใช้แบ็กสแลชและใส่เครื่องหมายคำพูดคู่

"UPDATE my_table SET row =\"hi, my name's tim.\";

คุณหมายถึงอะไร คุณกำลังบอกว่าPRINT \"hi, my name's tim.\";จะไปทำงานใน SSMS หรือไม่ มันไม่ทำงานเลยและไม่มีใครเคยบอกว่ามันใช้งานได้
Mohammad Musavi

จะไม่ทำงาน
Santosh Jadi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.