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

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

문제는 작은 따옴표의 이스케이프 문자입니다. 또한 작은 따옴표 ( ) \\\'대신 이중 이스케이프를 시도했지만 \'작동하지 않았습니다. 내가 뭘 잘못하고 있죠?



답변

작은 따옴표를 두 배로 늘리십시오 (많은 데이터베이스가 그렇게 생각합니다).

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

문서 에서 관련 인용 :

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


답변

작은 따옴표를 두 배로 늘려 탈출하고 싶다고 생각합니다.

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


답변

문자열의 모든 ( ‘)를 바꾸려면 다음을 사용하십시오.

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

예:

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


답변

데이터베이스에 삽입 해야하는 루프 또는 json 문자열이있는 경우를 대비하여. 문자열을 작은 따옴표로 바꾸십시오. 여기 내 해결책이 있습니다. 작은 따옴표가 포함 된 문자열이있는 경우의 예입니다.

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

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

이것은 C #과 Java에서 나를 위해 작동합니다.


답변

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("'", "''");
}


답변

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

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

sqlite3 $db_name "insert into foo values (\"$columnA\", $columnB)";


답변