prosource

MariaDB는 'view' 테이블에서 datetime 필드로 필터링할 때 빈 집합을 반환하는 반면 MySQL(및 base view sql)은 정상적으로 작동합니다.

probook 2023. 10. 10. 20:37
반응형

MariaDB는 'view' 테이블에서 datetime 필드로 필터링할 때 빈 집합을 반환하는 반면 MySQL(및 base view sql)은 정상적으로 작동합니다.

여기 첫번째 질문은 잘 설명되지 않았다면 죄송합니다.

여러 개의 테이블 조인을 사용하여 더 쉽게 선택할 수 있도록 DB에 여러 보기가 있으며, 해당 보기에는 date_registered(datetime) 필드가 있지만 해당 필드에서 WHERE를 사용하면 항상 빈 집합이 반환됩니다.

MariaDB 10.1.48 (Ubuntu 18.04 repo의 최신 버전)을 사용하고 있는데 MySQL 5.7에 대한 동일한 테스트는 정상적으로 작동합니다.

예제를 통해 보다 쉽게 볼 수 있습니다.

견본 자료

select id, date_registered from v_tracking limit 5;
+-------+---------------------+
| id    | date_registered     |
+-------+---------------------+
| 13258 | 2021-10-20 12:56:28 |
| 13257 | 2021-10-20 12:51:37 |
| 13256 | 2021-10-20 12:51:37 |
| 13255 | 2021-10-20 12:46:13 |
| 13254 | 2021-10-20 12:42:13 |
+-------+---------------------+

simple select with where date_registered > 'xxxx-xx-xx'

select id, date_registered from v_tracking where date_registered > '2021-10-01' limit 5;
Empty set (0.01 sec)

다른 필드로 필터링작업

select id, date_registered from v_tracking where id_company = 6 limit 5;
+-------+---------------------+
| id    | date_registered     |
+-------+---------------------+
| 13227 | 2021-10-20 06:52:13 |
| 13226 | 2021-10-20 06:43:22 |
| 13225 | 2021-10-20 06:43:04 |
| 13224 | 2021-10-20 06:37:12 |
| 13223 | 2021-10-20 06:23:23 |
+-------+---------------------+
5 rows in set (0.01 sec)

그리고 이제 가장 미친 부분은

'주문 기준' 작업 추가

select id, date_registered from v_tracking where date_registered > '2021-10-01' order by id desc limit 5;
+-------+---------------------+
| id    | date_registered     |
+-------+---------------------+
| 13258 | 2021-10-20 12:56:28 |
| 13257 | 2021-10-20 12:51:37 |
| 13256 | 2021-10-20 12:51:37 |
| 13255 | 2021-10-20 12:46:13 |
| 13254 | 2021-10-20 12:42:13 |
+-------+---------------------+
5 rows in set (0.01 sec)

날짜/timestamp로 변환을 강요하지만, 인덱스를 건너뛰게 될 가능성이 있습니다.

select id, date_registered from v_tracking where timestamp(date_registered) > '2021-10-01' limit 5;
+-------+---------------------+
| id    | date_registered     |
+-------+---------------------+
| 13258 | 2021-10-20 12:56:28 |
| 13257 | 2021-10-20 12:51:37 |
| 13256 | 2021-10-20 12:51:37 |
| 13255 | 2021-10-20 12:46:13 |
| 13254 | 2021-10-20 12:42:13 |
+-------+---------------------+

그러나 다른 방법은 아닌

select id, date_registered from v_tracking where date_registered > timestamp('2021-10-01')  limit 5;
Empty set (0.01 sec)

xxxxx-xxxxxx:xxx'도 사용해 보았지만, 결과도 마찬가지로 날짜를 문자열로 사용하는 데 문제가 있을 수 있다고 생각했습니다(이전에는 문제가 없었지만), date_registered < now()>를 사용하면 빈 세트가 반환됩니다.

'show create v_tracking'을 사용하여 전체 SQL을 복사하고(모든 조인 등 포함), where date_registered > 'xxxx-xxx'를 추가하여 실행하면(뷰를 사용하는 대신) 작동합니다.

WTF가 여기가 그립습니까?

예, date_registered는 datetime 필드입니다.

desc v_tracking;
+------------------------+--------------+------+-----+---------+-------+
| Field                  | Type         | Null | Key | Default | Extra |
+------------------------+--------------+------+-----+---------+-------+
| id                     | int(11)      | NO   |     | 0       |       |
..... 
| date_registered        | datetime     | YES  |     | NULL    |       |
+------------------------+--------------+------+-----+---------+-------+

좀 더 파헤친 끝에 마리아DB 버전을 최근 버전으로 업그레이드했고, 문제는 해결되었습니다.

언급URL : https://stackoverflow.com/questions/69645441/mariadb-returns-empty-set-when-filtering-by-a-datetime-field-on-a-view-table

반응형