SQLite 쿼리에 사용하기 위해 작은 따옴표 문자를 이스케이프 처리


180

데이터베이스 스키마 (지금까지 하나의 테이블 만)와 해당 테이블의 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');

문서 에서 관련 인용 :

문자열 상수는 문자열을 작은 따옴표 ( ')로 묶어 형성합니다. 파스칼에서와 같이 문자열 내에 작은 따옴표를 두 개의 작은 따옴표를 넣어서 인코딩 할 수 있습니다. 백 슬래시 문자를 사용하는 C 스타일 이스케이프는 표준 SQL이 아니므로 지원되지 않습니다. BLOB 리터럴은 16 진 데이터를 포함하고 단일 "x"또는 "X"문자가 앞에 오는 문자열 리터럴입니다. ... 리터럴 값은 "NULL"토큰 일 수도 있습니다.


8
또한 호스트 언어가 지원하는 경우 바인딩 된 매개 변수를 사용하는 것이 좋습니다 (대부분은 지원하지만 SQLite 셸은 지원하지 않음). 그러면 SQL이 INSERT INTO table_name (field1, field2) VALUES (?, ?)되고 값이 직접 (대체없이) 제공됩니다.
Donal Fellows

1
큰 따옴표 만 사용할 수 있습니까? 같은 : INSERT INTO table_name (field1, field2) VALUES (123, "안녕하세요"); ?
JacksOnF1re

또한 문자열의 수명에 따라 첫 번째 단계는 다시 두 배로 늘리기 전에 ''를 '로 변환하는 것입니다.
게리 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

bash 스크립트에서 null 또는 이스케이프가 필요한 문자 (하이픈과 같은)가 될 수있는 값에는 값을 큰 따옴표로 묶는 것이 필요하다는 것을 알았습니다.

이 예에서 columnA의 값은 null이거나 하이픈을 포함 할 수 있습니다. :

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.