2009-03-02 35 views
123

Tôi đã viết lược đồ cơ sở dữ liệu (chỉ một bảng cho đến nay) và các câu lệnh INSERT cho bảng đó trong một tệp. Sau đó, tôi đã tạo ra cơ sở dữ liệu như sau:Thoát ký tự trích dẫn đơn để sử dụng trong truy vấn SQLite

$ 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 

Dòng 16 của tập tin của tôi trông giống như sau:

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

Vấn đề là các ký tự thoát cho một giá duy nhất. Tôi cũng đã cố gắng gấp đôi thoát khỏi báo giá duy nhất (sử dụng \\\' thay vì \'), nhưng điều đó không hoạt động. Tôi đang làm gì sai?

Trả lời

213

Cố gắng tăng gấp đôi lên các dấu nháy đơn (nhiều cơ sở dữ liệu mong đợi nó như vậy), vì vậy nó sẽ là:

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

quote liên quan từ the documentation:

Một chuỗi liên tục được hình thành bởi kèm theo chuỗi trong dấu nháy đơn ('). Một trích dẫn duy nhất trong chuỗi có thể được mã hóa bằng cách đặt hai dấu nháy đơn trong một hàng - như trong Pascal. Lối thoát kiểu C sử dụng ký tự dấu gạch chéo ngược không được hỗ trợ vì chúng không phải là SQL chuẩn. BLOB literals là các chuỗi ký tự chứa dữ liệu thập lục phân và được đặt trước bởi một ký tự "x" hoặc "X" đơn. ... Giá trị theo nghĩa đen cũng có thể là mã "NULL".

+5

Ngoài ra, xem xét sử dụng ràng buộc các tham số nếu ngôn ngữ máy chủ hỗ trợ chúng (nhất là, nhưng trình bao SQLite thì không). SQL sau đó sẽ là 'INSERT INTO table_name (field1, field2) VALUES (?,?)' Và các giá trị sẽ được cung cấp trực tiếp (và không có thay thế). –

38

Tôi tin rằng bạn muốn để thoát khỏi bằng cách nhân đôi quote duy nhất:

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

Trong C# bạn có thể sử dụng sau đây để thay thế các dấu nháy đơn với một dấu nháy kép:

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

Và đầu ra sẽ là:

"St. Mary''s" 

Và, nếu bạn đang làm việc ng với Sqlite trực tiếp; bạn có thể làm việc với các đối tượng thay vì chuỗi và bắt mọi thứ đặc biệt như DBNull:

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

Chỉ trong trường hợp nếu bạn có một vòng lặp hoặc một chuỗi json cần chèn vào cơ sở dữ liệu. Cố gắng thay thế chuỗi bằng một trích dẫn đơn. đây là giải pháp của tôi. ví dụ nếu bạn có một chuỗi có chứa một dấu nháy đơn.

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

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

này làm việc cho tôi trong C# và java

0

cho thay thế tất cả (') trong chuỗi của bạn, sử dụng

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

dụ:

sample = "St. Mary's and St. John's"; 
escapedSample = sample.replace(/\'/g,"''") 
Các vấn đề liên quan