반응형
내 데이터베이스에 특정 값이 이미 있는지 확인하려고합니다. JDBC를 사용하여 Java 독립 실행 형 앱에서 데이터베이스에 액세스하고 있습니다 (db 작업에 레코드를 삽입하는 쿼리이므로 설정 및 연결이 정상입니다).
String queryCheck = "SELECT * from messages WHERE msgid = " + msgid;
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery(queryCheck); // execute the query, and get a java resultset
// if this ID already exists, we quit
if(rs.absolute(1)) {
conn.close();
return;
}
이 오류가 발생합니다 (내 SQL 구문에 분명히 문제가 있음).
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd-f05708071f8f' at line 1
그러나 MySQL 명령 줄에서이 명령을 실행하려고하면 작동합니다! 제 진술에 무슨 문제가 있는지 말씀해 주시겠습니까? 팁 주셔서 감사합니다!
해결 방법
MySQL에서 String
을 따옴표로 묶어야하므로 쿼리는
SELECT * from messages WHERE msgid = 'd-f05708071f8f';
아니
SELECT * from messages WHERE msgid = d-f05708071f8f;
따라서 코드는
String queryCheck = "SELECT * from messages WHERE msgid = '" + msgid + "'";
이러한 종류의 문제와 SQL 주입의 위험을 피하기 위해 PreparedStatement
를 사용하는 것이 좋습니다.
final String queryCheck = "SELECT * from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
쿼리 작성에 문자열 연결을 사용하는 것은 매우 나쁜 습관으로 간주됩니다. 지금은 오래되었습니다.
또한 전체 select *
대신 select count (*)
를 사용하는 것이 좋습니다. 이는 훨씬 적은 데이터를 반환하기 때문입니다 ( ResultSet
) 및 MySQL도이를 최적화 할 수 있습니다.
final String queryCheck = "SELECT count(*) from messages WHERE msgid = ?";
final PreparedStatement ps = conn.prepareStatement(queryCheck);
ps.setString(1, msgid);
final ResultSet resultSet = ps.executeQuery();
if(resultSet.next()) {
final int count = resultSet.getInt(1);
}
참조 페이지 https://stackoverflow.com/questions/16099382
반응형
'MySql' 카테고리의 다른 글
MySQL에서 문자를 UTF8로 변환 (Ã ©에서 é로) (0) | 2021.01.04 |
---|---|
MySQL 선택 쿼리 값을 PHP 변수로 가져 오는 방법은 무엇입니까? (0) | 2021.01.04 |
MySQL 단일 SQL 문에 대한 열 헤더 출력을 억제하려면 어떻게해야합니까? (0) | 2021.01.04 |
MySQL 저장 프로 시저에서 문자열 목록을 전달하는 방법은 무엇입니까? (0) | 2021.01.04 |
MySQL MYSQL의 자동 ID 열에 값을 삽입하는 방법 (0) | 2021.01.04 |
댓글