이 SQL 쿼리의 실행순서가 이해가 안가네요.. 0 3 1,443

by bob8gook [SQL Query] sql mysql [2020.04.01 17:31:18]


select count(*),floor(rand(0)*2) as x from myTable group by x;
 

myTable에는 5개의 행이 저장되어있구요.

위 쿼리를 실행하면

ERROR 1062 (23000): Duplicate entry '1' for key 'group_key'

이렇게 에러가 발생합니다.

 

왜 발생하는지에 대해 설명하는 스택오버플로우 글이 있는데(https://stackoverflow.com/questions/11787558/sql-injection-attack-what-does-this-do)

이해가 안가네요.

 

저기서 말하는게

MariaDB [myDb]> select floor(rand(0)*2) as x from myTable;
+---+
| x |
+---+
| 0 |
| 1 |
| 1 | <- duplicate key
| 0 |
| 1 |
+---+
5 rows in set (0.000 sec)
 

이렇게 쿼리를 실행했을 때 3번째 행에서 1이 중복되어 저렇게 duplicate 에러가 나는거라는데.

중요한건 count(*)를 넣어야 에러가 발생한다는거죠.

count(*)는 단순히 행의 개수를 출력해주는거잖아요.

그런데 이거랑 duplicate 에러가 무슨 연관인건지 이해가 안가네요.

 

혹시 아시는 분 계실까요?

 

by pajama [2020.04.01 20:30:08]

흠..여기저기 이 문제와 관련한 토론이 있군요. 결론적으로는 버그로 봐야할 것 같습니다. 오류가 나지 않으려면 쿼리를 수정할 수 밖에 없을 듯 합니다.

https://okky.kr/article/401944

https://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=qna_db&wr_id=230929


by 마농 [2020.04.02 10:00:16]

랜덤함수로 그룹바이 할 일은 사실상 없겠죠.
실제 사용될만한 쿼리가 아니라 에러 난다고 해서 문제될 건 없을 것 같습니다.
굳이 이해가 필요한 문제라기 보다는, 이런 이슈도 있구나 정도로 넘어가면 될 듯 합니다.


by bob8gook [2020.04.02 17:44:26]

감사합니다~ 저게 에러 기반의 SQL 인젝션 기법에 사용되는 구문인데

원리를 이해하려고 질문 드렸었어요~

제가 보안공부하는 학생이여서요 ㅎㅎ

 

애초에 group by [속성] 에서 속성에 오는걸 기준으로 분류해주는거라

중복키 문제가 발생할 일이 없어서 이해가 안갔었는데..

단순 버그였군요!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입