2020년 10월 30일 금요일

8.0.22 버전부터 변경된 prepared statement에 대하여

2020년 10월 MySQL 8.0.22 버전이 GA가 되었고, 그에 따라 변경된 prepared statement에 대해 알아보자.
먼저 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.
요약하면.. 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)

댓글 없음:

댓글 쓰기

결혼이민비자 신청방법(F-6-1 국민의 배우자)

 제가 일본인 여자친구와 결혼 후, 한국에 귀국하기 위해 신청한 결혼이민비자에 대하여 작성해보도록 하겠습니다. 필자는 일본에서 근무하고 있었으며, 한국에서의 소득은 없었습니다. 결혼이민비자를 신청한 날짜는 2021-04-21 이며, 사증이 발급된 날짜...