programing

하나의 열이 보기에 다른 데이터 정렬로 끝납니다.

batch 2023. 8. 24. 21:53
반응형

하나의 열이 보기에 다른 데이터 정렬로 끝납니다.

저는 좀 이상한 문제가 있습니다.데이터베이스가 utf8mb4_unicode_ci colation으로 설정되었습니다.데이터베이스 내의 (WooCommerce) 테이블도 마찬가지입니다.표의 열도 utf8mb4_unicode_ci입니다.

뷰를 생성하고 이제 계산된 필드 sku_class에 대해 다른 조합(autf8mb4_general_ci)을 가져옵니다.이것이 어떻게 가능한 걸까요?그리고, 더 중요한 것은, 어떻게 해결할 수 있을까요?

보기를 만들기 위한 단축 쿼리는 다음과 같습니다.

SET character_set_connection = 'utf8mb4';

CREATE VIEW vw_wc_product_details AS 

SELECT
        pm.sku,
        CASE
            -- manual fixes 
            WHEN pm.sku LIKE 'AB1404/%' THEN 'c'    
            -- default rules
            WHEN pm.sku LIKE 'ABs__-_%' THEN 's'    
            WHEN pm.sku LIKE 'ABt__-_%' THEN 't'
            WHEN pm.sku LIKE 'AB____/%' THEN 'pc'  
            WHEN ( SELECT COUNT(sku) FROM wp_wc_product_meta_lookup WHERE sku LIKE CONCAT(pm.sku, '/_%') ) >= 1 THEN 'p' 
            WHEN pm.sku LIKE 'AB____%' AND LENGTH(pm.sku) = 6 THEN 'c' 
            WHEN pm.sku LIKE 'AX%' AND LENGTH(pm.sku) >= 6 THEN 'm'
            ELSE 'x'
        END as sku_class
    
FROM    wp_wc_product_attributes_lookup AS pa
LEFT    JOIN wp_terms AS t ON pa.term_id = t.term_id
LEFT    JOIN wp_wc_product_meta_lookup AS pm ON pa.product_id = pm.product_id
LEFT    JOIN wp_posts AS p ON pa.product_id = p.ID

COLLATE 'utf8mb4_unicode_ci'

SET character_set_connection = 'utf8mb4';그리고.COLLATE 'utf8mb4_unicode_ci'제가 받은 조합 오류의 불법적인 혼합으로 인해 라인이 추가되었고, 이로 인해 관련된 모든 조합을 이중으로 확인할 수 있게 되었습니다.

위의 댓글에서 @shadow가 제공한 입력을 기반으로, 저는 결국 추가했습니다.COLLATE 'utf8mb4_unicode_ci'에게END as sku_class라인, 그래서 그것은 지금 읽힙니다.END COLLATE 'utf8mb4_unicode_ci' as sku_class.

이것은 내가 만든 뷰에 대한 트릭입니다.즉, PHP PDO 쿼리의 오류 메시지 없이 작동하지만 보조 보기 내에서 보기를 사용할 때 여전히 잘못된 조합 오류 메시지가 표시됩니다.

phpMyAdmin에서 2차 보기에 대한 오류 메시지를 제거하는 방법을 찾으면 이 게시물을 업데이트하겠습니다.

네 - 알았어요, 처음에 오류 메시지를 잘못 읽어서 제 질문의 잘못된 부분을 보고 있었어요.

사실 이 부분이 저를 괴롭힌 부분입니다.

case
    when pd.sku_class not in ('s','t') then 'act'

pd.sku_class데이터베이스와 테이블의 모든 것이 utf8mb_dll_ci로 되어 있기 때문에 분명히 데이터 정렬 문제를 일으켰지만, 여전히 이유를 알 수 없습니다.서버 설정만 latin으로 되어 있기 때문에 그 이유일 것입니다.

어쨌든, 바꾸는 것.pd.sku_class not in ('s','t')안으로not find_in_set( cast( pd.sku_class as char ), 's,t' )속임수를 썼어요!

case
    when not find_in_set( cast( pd.sku_class as char ), 's,t' ) then 'act'

그래서 이제 모든 것이 저에게 효과가 있습니다.이것이 미래에 다른 누군가에게도 도움이 되기를 바랍니다 :)

언급URL : https://stackoverflow.com/questions/75652938/one-column-ends-up-with-different-collation-in-view

반응형