ยกเว้นอักขระอัญประกาศเดี่ยวเพื่อใช้ในแบบสอบถาม SQLite


180

ฉันเขียน schema ฐานข้อมูล (จนถึงหนึ่งตารางเท่านั้น) และคำสั่ง INSERT สำหรับตารางนั้นในไฟล์เดียว จากนั้นฉันสร้างฐานข้อมูลดังนี้:

$ sqlite3 newdatabase.db
SQLite version 3.4.0
Enter ".help" for instructions
sqlite> .read ./schema.sql
SQL error near line 16: near "s": syntax error

บรรทัดที่ 16 ของไฟล์ของฉันมีลักษณะดังนี้:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there\'s');

ปัญหาคือตัวหนีสำหรับราคาเดียว ฉันยังพยายามหลีกเลี่ยงการอ้างสองครั้ง (โดยใช้\\\'แทน\') แต่นั่นก็ไม่ได้ผลเช่นกัน ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


294

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

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

ข้อความที่เกี่ยวข้องจากเอกสาร :

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


8
นอกจากนี้ให้พิจารณาใช้พารามิเตอร์ที่ถูกผูกไว้หากภาษาโฮสต์สนับสนุนพวกเขา (ส่วนใหญ่ทำ แต่เชลล์ SQLite ไม่ได้) SQL จะเป็นINSERT INTO table_name (field1, field2) VALUES (?, ?)และค่าจะถูกส่งโดยตรง (และไม่มีการแทนที่)
Donal Fellows

1
เราไม่สามารถใช้เครื่องหมายคำพูดคู่ได้หรือไม่ like: INSERT INTO table_name (field1, field2) ค่า (123, "Hello there"); ?
JacksOnF1re

นอกจากนี้ยังขึ้นอยู่กับอายุของสตริงขั้นตอนแรกอาจจะแปลง '' เป็น 'ก่อนที่จะเพิ่มเป็นสองเท่าอีกครั้ง
Gary Z

44

ฉันเชื่อว่าคุณต้องการหลบหนีโดยเพิ่มคำพูดเดียว:

INSERT INTO table_name (field1, field2) VALUES (123, 'Hello there''s');

10

เพื่อแทนที่ทั้งหมด (') ในสตริงของคุณใช้

.replace(/\'/g,"''")

ตัวอย่าง:

sample = "St. Mary's and St. John's";
escapedSample = sample.replace(/\'/g,"''")

6

ในกรณีที่คุณมีลูปหรือสตริง json ที่จำเป็นต้องใส่ในฐานข้อมูล ลองแทนที่สตริงด้วยเครื่องหมายคำพูดเดี่ยว นี่คือทางออกของฉัน ตัวอย่างถ้าคุณมีสตริงที่มีของคำพูดเดียว

String mystring = "Sample's";
String myfinalstring = mystring.replace("'","''");

 String query = "INSERT INTO "+table name+" ("+field1+") values ('"+myfinalstring+"')";

ใช้ได้กับฉันใน c # และ java


0

ใน C # คุณสามารถใช้สิ่งต่อไปนี้เพื่อแทนที่คำพูดเดี่ยวด้วยเครื่องหมายคำพูดคู่:

 string sample = "St. Mary's";
 string escapedSample = sample.Replace("'", "''");

และผลลัพธ์จะเป็น:

"St. Mary''s"

และถ้าคุณทำงานกับ Sqlite โดยตรง คุณสามารถทำงานกับวัตถุแทนสายอักขระและจับสิ่งพิเศษเช่น DBNull:

private static string MySqlEscape(Object usString)
{
    if (usString is DBNull)
    {
        return "";
    }
    string sample = Convert.ToString(usString);
    return sample.Replace("'", "''");
}

0

ในสคริปต์ทุบตีฉันพบว่าการหลีกเลี่ยงอัญประกาศล้อมรอบค่านั้นเป็นสิ่งจำเป็นสำหรับค่าที่อาจเป็นโมฆะหรือมีอักขระที่ต้องใช้การหลบหนี (เช่นเครื่องหมายขีดกลาง)

ในตัวอย่างนี้ค่าของ columnA อาจเป็นโมฆะหรือมียัติภังค์:

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.