2014-11-22 2 views
0

저는 MYSQL에 대해 잘 알고 있습니다. 지금 당장 IBM SQL DB (DB2)에 대한 쿼리를 시도 : "username = '"+ username + "'및 password = '"+ password + "'; 여기서 HOMEBASEDAPP.LOGINDB에서 displayname을 선택하십시오.DB2-SQL에 대한 쿼리 선택에 실패했습니다

이것은 쿼리를 실행할 때 나타나는 오류입니다.

오류 [IBM] [CLI 드라이버] [DB2/LINUXX8664] SQL0206N "USERNAME"이 (가) 사용 된 컨텍스트에서 유효하지 않습니다. SQLSTATE = 42703

내 테이블이 어떻게 보이는지의 스크린 샷을 첨부 : DB Screenshot

+0

disname을 확인해야 할 수 있습니다. displayname이어야합니다. – zawhtut

+0

지적 해 주셔서 고맙습니다. "displayname"을 사용하여 쿼리를 실행하고 있었는데 여기에 잘못 적어 두었습니다. 왜 어떤 오류가 발생 했습니까? – JavascriptL

+0

테이블 별칭과 함께 사용하는 방법은 어떻습니까? 비록이 사람이 좋아 보이더라도. 그리고 스키마 이름을 사용하지 않고 어때? 나는 전에 bluemix를 사용하지 않으므로 bluemix에서 쿼리를 실행하는 방법에 대해 많이 알지 못합니다. – zawhtut

답변

3

DB2는 모든 데이터베이스 개체는 기본적으로 대문자을 기대하기 때문에 귀하의 쿼리가 실패합니다. 따라서 실행 전에 쿼리의 소문자 열 이름을 대문자로 자동 변환합니다.

열 이름이 소문자이므로이 쿼리는 실패합니다.

내 생각에 열 이름을 대문자로 변환하는 것이 장기적으로 많은 고통을 덜어주기 때문입니다.

그러나 쿼리의 열 이름을 큰 따옴표로 묶기 만하면 DB2가 올바른 대소 문자를 유지하므로 쿼리가 작동합니다.

나는이 일 것으로 예상 : SELECT "displayname" FROM HOMEBASEDAPP.LOGINDB WHERE \"username\" = '" + username +"' AND \"password\" = '" + password +"';"

참고 : 여기 쿼리가 매우 불안하고 무엇보다도 SQL 주입 공격에 열려 있습니다. 다행히도 앱 내에서 쿼리를 '준비'하고 값을 매개 변수로 전달할 수있는 드라이버를 사용할 계획입니다.

+1

거짓. 일반적으로 SQL은 오브젝트 이름을 작성하는 동안 대소.자를 구분하도록 특별히 설정하지 않는 한, 표준의 일부로 대소.자를 구분하지 않습니다. 이렇게하면 문제가 해결 될 수 있지만 처음에는 설정이 엉망이기 때문입니다. –

+0

틀렸어. DB2는 기본적으로 대소 문자를 구분합니다. 또한 개체가 특정 경우에 만들어지면 쿼리에서 개체 이름을 구분하지 못하면 쿼리가 실패하게됩니다. 내 대답이 받아 들여 졌으므로 분명 정확합니다. –

+0

아니요.열에 포함 된 데이터 _ 검색은 대소 문자를 구분합니다. 객체 이름은 쿼리 할 때 대소 문자를 구별하지 않습니다 ([생성하는 동안 모든 것을 대문자로 변환하기 때문입니다] (http://bytes.com/topic/db2/answers/473979-mixed-case-table-column-names)). 즉, 개체 이름이 생성 중에 이스케이프를 통해 자격을 얻지 않는 한, 그 시점에서 부여한 것과 일치해야합니다 (처리 할 고통입니다. 일반적으로 그렇게하지 않는 것이 좋습니다). 오, 당신은''displayname "'에 대한 따옴표를 벗어나는 것을 잊었습니다 ... ... –

0

당신은 SQL 스크립트를 수정해야합니다. 그렇지 않으면 큰 따옴표의 첫 번째 항목을 찾을 때 db2가 문자를 종료 문자로 처리하므로 쿼리가 아래까지 실행되어 오류가 발생합니다.

http://www.justskins.com/forums/insert-with-double-quote-148522.html

:

DB2

당신은 아래에서 자세히를 들어, 전체 SQL 쿼리의 구문 분석 따옴표 처리를 취할 필요가

은 샘플 참조 링크입니다 "사용자 이름 = 'HOMEBASEDAPP.LOGINDB에서 표시 이름을 선택"

+0

이것은 그가 어떻게 그 문장을 실행하는지에 전적으로 달려 있습니다. 그가 자바를 사용하고 있다면 그가 준 형태가 유효합니다. 그리고 문자열을 연결하는 방법 (... 이런 식으로해야 할 일은 아니지만 여기에서는 문제가 아닙니다). –