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
내 파일의 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 Literals는 16 진수 데이터를 포함하는 문자열 리터럴이며 단일 "x"또는 "x"문자가 선행됩니다. ... 문자 그대로의 가치는 "널"토큰 일 수 있습니다.
다른 팁
나는 당신이 단일 견적을 두 배로 늘려 탈출하고 싶다고 생각합니다.
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("'", "''");
}