먼저 prepared statement가 무엇이고 기본적인 사용법에 대해 알아보자
Prepared statement
placeholder를 이용하여 쿼리를 실행하는 구문으로, SQL Injection을 방어하기 위해 많이 사용한다
사용법
# 쿼리 준비
PREPARE stmt1 FROM
'SELECT
productCode,
productName
FROM products
WHERE productCode = ?';
# 조건문의 변수 설정
SET @pc = 'S10_1678';
# 변수를 이용하여 쿼리 실행
EXECUTE stmt1 USING @pc;
# statement 해제
DEALLOCATE PREPARE stmt1;
MySQL 8.0.22 변경 사항
For a prepared statement of the form SELECT expr1, expr2, ... FROM table ORDER BY ?, passing an integer value N for the parameter no longer causes ordering of the results by the Nth expression in the select list; the results are no longer ordered, as is expected with ORDER BY constant.
For a prepared statement of the form SELECT expr1, expr2, ... FROM table ORDER BY ?, passing an integer value N for the parameter no longer causes ordering of the results by the Nth expression in the select list; the results are no longer ordered, as is expected with ORDER BY constant.
요약하면.. SELECT하는 COLUMN의 순번으로 ORDER BY를 할 수 없게 되었다
# 테스트용 테이블 생성
CREATE TABLE `test_table` (
`id` int NOT NULL AUTO_INCREMENT,
`price` int NOT NULL,
PRIMARY KEY (`id`)
);
# 데이터 등록
INSERT INTO test_table (price) VALUES (10), (50), (20), (40), (30);
# statement 준비
mysql> PREPARE stmt1 FROM 'SELECT id, price FROM test_table ORDER BY ?';
Query OK, 0 rows affected (0.02 sec)
Statement prepared
# 2번 째로 SELECT하는 컬럼인 price를 기준으로 소트하기 위해 변수 설정
mysql> SET @a=2;
Query OK, 0 rows affected (0.00 sec)
# 예상대로 결과가 정렬되지 않는다
mysql-8.0.22> EXECUTE stmt1 USING @a;
+----+-------+
| id | price |
+----+-------+
| 1 | 10 |
| 2 | 50 |
| 3 | 20 |
| 4 | 40 |
| 5 | 30 |
+----+-------+
5 rows in set (0.01 sec)
# 이전 버전에서는 정상적으로 정렬되는 걸 확인할 수 있다
mysql-8.0.21> EXECUTE stmt1 USING @a;
+----+-------+
| id | price |
+----+-------+
| 1 | 10 |
| 3 | 20 |
| 5 | 30 |
| 4 | 40 |
| 2 | 50 |
+----+-------+
5 rows in set (0.01 sec)
댓글 없음:
댓글 쓰기