SQL에서 인용문 '을(를) 어떻게 처리합니까?
John Doe 등의 이름을 가진 데이터베이스가 있습니다.불행하게도 이 이름들 중 일부는 Keiran O'Keefe와 같은 인용구를 포함하고 있습니다.다음과 같은 이름을 검색하려고 하면 다음과 같습니다.
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
저는 (이해할 수 있는) 오류를 받습니다.
이 오류가 발생하지 않도록 하려면 어떻게 해야 합니까?저는 Oracle과 PLSQL을 사용하고 있습니다.
이스케이프 문자는 '이므로 따옴표를 두 개의 따옴표로 대체해야 합니다.
예를들면,
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
된다
SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'
그렇긴 하지만, 이것을 스스로 하는 것은 아마도 잘못된 것입니다.언어에 SQL에서 사용할 문자열을 이스케이프하는 기능이 있을 수 있지만 매개 변수를 사용하는 것이 더 좋습니다.일반적으로 이것은 다음과 같이 작동합니다.
SQL 명령은 다음과 같습니다.
SELECT * FROM PEOPLE WHERE SURNAME=?
그런 다음 실행할 때 매개 변수로 "O'Keefe"를 전달합니다.
매개 변수 값을 설정하기 전에 SQL을 구문 분석하므로 매개 변수 값이 SQL의 구조를 변경할 수 없습니다. 다른 매개 변수로 동일한 문을 여러 번 실행하려는 경우에는 더 빠릅니다.
또한 예를 들어 오류가 발생하는 동안 문자열을 적절하게 이스케이프하지 않음으로써 다른 많은 문제에 대해 스스로를 개방한다는 점을 지적해야 합니다.좋은 출발점이나 다음의 고전적인 xkcd 만화는 http://en.wikipedia.org/wiki/SQL_injection 을 참조하십시오.
Oracle 10 솔루션은
SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'
Matt가 제안한 바와 같이 매개변수화된 쿼리는 당신의 친구입니다.
Command = SELECT * FROM PEOPLE WHERE SURNAME=?
그것들은 당신을 두통으로부터 보호해줄 것입니다.
- 따옴표가 있는 문자열
- 날짜를 사용하여 쿼리하는 중
- SQL 주입
매개 변수화된 SQL을 사용하면 구문 분석에 필요한 작업량을 줄임으로써 Oracle의 CPU 오버헤드(기타 리소스)를 줄일 수 있습니다.매개 변수를 사용하지 않는 경우(Oracle에서는 바인딩 변수라고 함) "select * from foo"와 "select * from bar='cat'은 별도의 문으로 취급되며, "select * from foo='dog'는 동일한 문으로 취급됩니다. 여기서 "select * from bar=:b1"은 구문, 참조되는 객체의 유효성 등을 의미합니다.다시 확인할 필요가 없습니다.바인딩 변수를 사용할 때 문제가 발생하는 경우가 있는데, 이는 일반적으로 가장 효율적인 SQL 실행 계획을 얻지 못하는 것으로 나타나지만 이에 대한 해결 방법이 있으며 이러한 문제는 실제로 사용 중인 술어, 인덱싱 및 데이터 스큐에 따라 달라집니다.
입력 필터링은 일반적으로 데이터베이스 계층이 아닌 언어 수준에서 수행됩니다.
및 php 및NET 둘 다 SQL 문을 이스케이프하기 위한 각각의 라이브러리를 가지고 있습니다.언어를 확인하고 사용 가능한 항목을 확인합니다.
데이터가 신뢰할 수 있는 경우 문자열 바꾸기를 수행하여 ' 앞에 다른 '를 추가하여 데이터를 이스케이프할 수 있습니다.일반적으로 입력이 악의적일 위험이 없는 경우 이 정도면 충분합니다.
좋은 질문은 당신이 어떤 언어를 사용하고 있느냐는 것입니다.
PHP 파일: SELECT * FROM PEOPLE WERENY='mysql_escape_string(O'Keefe)'
하지만 당신이 언어를 지정하지 않았기 때문에, 나는 당신이 탈출 문자열 함수 mysql 또는 당신의 언어로 조사할 것을 제안할 것입니다.
Zend Framework를 사용하는 경우 견적을 처리하는 것이 코드입니다.
$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$db->quoteInto('your_query_here = ?','your_value_here');
예를 들어;
//SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' will become
SELECT * FROM PEOPLE WHERE SURNAME='\'O\'Keefe\''
구글에서 30대 이하로 발견...
언급URL : https://stackoverflow.com/questions/29699/how-do-i-deal-with-quotes-in-sql
'programing' 카테고리의 다른 글
NPM과 NVM의 차이 (0) | 2023.07.30 |
---|---|
경고: mysql_fetch_array(): 제공된 인수가 올바른 MySQL 결과가 아닙니다. (0) | 2023.07.30 |
스프링 관련 문제:예기치 않은 오류가 발생했습니다(type=Not Found, status=404). (0) | 2023.07.30 |
JPQL 대소문자 구분 안 함 (0) | 2023.07.30 |
fromPromPromise가 관찰 가능 유형에 없습니다. (0) | 2023.07.30 |