programing

JSON_ARRAGEG 내부의 JSON_OBJ는 때때로 json 배열을 반환하고 때로는 string을 반환합니다.

abcjava 2023. 7. 20. 21:38
반응형

JSON_ARRAGEG 내부의 JSON_OBJ는 때때로 json 배열을 반환하고 때로는 string을 반환합니다.

JSON_OBJECT함수는 MariaDB 10.5.12의 조인 테이블에 키 인덱스가 있는지 여부에 따라 서로 다른 데이터 유형을 이상하게 반환합니다.

저는 json 배열로 게시물 댓글을 얻으려고 노력해 왔습니다.그리고 집계 함수의 출력이 이상하게 변하는 것을 알아차렸습니다.

항상 동일한 올바른 결과를 제공하지만 포장은 다양합니다.때때로 그것은escaped string추가적인 json 구문 분석이 필요하며, 때로는 이미 만들어진 경우도 있습니다.json array.

점차 원인에 가까워질 수 있었습니다.여기 버그를 보여주는 최소한으로 작동하는 쿼리 부분이 있습니다.

SELECT 
    JSON_ARRAYAGG(DISTINCT JSON_OBJECT(
        'comment_id', comment.id, 
              'text', comment.text
    ) ORDER BY comment.id) AS comments
FROM post
LEFT JOIN comment ON comment.post_id = post.id
LEFT JOIN vote ON vote.user_id = 1 AND vote.post_id = post.id
GROUP BY post.id

필수 조건은 키 인덱스가user_id에 존재합니다.vote테이블.

에 의해 조인이 발생하는 경우user_id필드 조건, 출력이 이스케이프 문자열임:

LEFT JOIN vote ON vote.user_id = 123 AND vote.post_id = post.id 

["{\"tag_id\": 1, \"name\": \"conubia\"}","{\"tag_id\": 21, \"name\": \"convallis\"}"]
["{\"tag_id\": 40, \"name\": \"amet\"}","{\"tag_id\": 41, \"name\": \"neque\"}"]

에 의해 병합이 발생하지 않는 경우user_id필드 조건, 출력은 json 배열:

LEFT JOIN vote ON vote.user_id = -1 AND vote.post_id = post.id 

[{"tag_id": 1, "name": "conubia"},{"tag_id": 21, "name": "convallis"}]
[{"tag_id": 40, "name": "amet"},{"tag_id": 41, "name": "neque"}]

키 인덱스가 없는 경우user_id모든 조인 조건에서 출력은 이스케이프 문자열입니다.

["{\"tag_id\": 1, \"name\": \"conubia\"}","{\"tag_id\": 21, \"name\": \"convallis\"}"]
["{\"tag_id\": 40, \"name\": \"amet\"}","{\"tag_id\": 41, \"name\": \"neque\"}"]

DDL 투표

CREATE TABLE `vote` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `user_id` INT(11) NULL DEFAULT NULL,
    `post_id` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`id`) USING BTREE,
    INDEX `user_id` (`user_id`) USING BTREE
)
ENGINE=InnoDB
AUTO_INCREMENT=1

질문.

색인을 제거하지 않고 데이터베이스를 사용하여 기능 출력의 우발적인 변경을 방지할 수 있습니까?

추정

CAST를 사용할 수 있을 것 같은데 저한테는 안 통했어요.

JSON의 버그가 탈출한 것과 관련이 있는 것 같습니다.

이 문제는 새 릴리스에서 수정되었습니다.MariaDB 10.6.5에서 테스트됨.

언급URL : https://stackoverflow.com/questions/69872120/json-object-inside-json-arrayagg-sometimes-return-json-array-sometimes-string

반응형