簡體   English   中英

MySQL 錯誤:操作 'UNION' 的排序規則混合非法

[英]MySQL error: Illegal mix of collations for operation 'UNION'

我是 Boxonix!

我目前正在為我的網站創建一個評論部分,但我遇到了一點麻煩:當我運行此查詢時,會彈出“Illegal mix of collations for operation 'UNION'”:

SELECT *
FROM comments
JOIN users ON comments.user_id = users.id
ORDER BY users.id DESC LIMIT $LIMIT1
UNION
SELECT *
FROM comments
JOIN videos ON comments.video_id = videos.id

我已經有點困惑了,我不經常使用 MySQL!
請幫忙!

您可以在查詢的SELECT部分強制整理。 例如,如果列videos.commentutf8_general_ci並且comments.commentutf8_unicode_ci你可以強制它相同:

SELECT 
   comment COLLATE utf8_general_ci
FROM comments
UNION
SELECT 
   comment
FROM videos

但這在無法完全按照您的需要翻譯排序規則的情況下用途有限。

為了避免“操作'UNION'的排序規則的非法混合”Mysql錯誤,您必須驗證相同索引列具有相同類型的排序規則或編碼。

問題在於兩個子查詢將具有不同的列集。

第一個子查詢將為您提供來自comments所有列和來自users所有列。 第二個子查詢將為您提供來自comments所有列和來自videos所有列。 除非兩個表usersvideos具有完全相同的列定義,否則UNION將無法工作。

您需要決定每個查詢需要哪些列,然后自定義每個SELECT ...以便它們匹配。

您不能在聯合之前使用 order by 語句,如果要先使用,則必須將結果轉換為臨時表。 然后說按條件排序,如下所示

select * from (SELECT * FROM comments
JOIN users ON comments.user_id = users.id
UNION
SELECT * FROM comments
JOIN videos ON comments.video_id = videos.id) as t order by id DESC LIMIT 1

這里重要的一點是,用戶和視頻都應該有與評論表相同的列數。因為如果你使用unionunion all你應該取相等的 no。 具有相同數據類型的列..

如果評論、用戶、視頻的列數不同,則用戶不要選擇 * from。 而是明確選擇所有列,如下所示

如果評論表有列 user_id,col1,col2,col3 那么

select user_id,col1,col2,col3 from (SELECT c.user_id,col1,col2,col3 FROM 
comments c JOIN users u c.user_id = u.id
UNION
SELECT c.user_id,col1,col2,col3 FROM comments c
JOIN videos v ON c.video_id = v.id) as t 
order by user_id DESC LIMIT 1

$LIMIT1替換$LIMIT1 1並在第二次查詢后執行ORDER BY 。試試這個:

(SELECT *
FROM comments
JOIN users ON comments.user_id = users.id)
UNION
(SELECT *
FROM comments
JOIN videos ON comments.video_id = videos.id)
ORDER BY id DESC LIMIT 1

注意:聯合操作要求您的兩個查詢中的每一個在其結果集中具有完全相同的列數。

只需比較所有表排序規則列,它應該在所有表中相同就像如果有 utf8_general_ci 那么所有要與 union 合並的表都應該有 utf8_general_ci 或者如果不同,則從結構中更改它或使用以下查詢。

ALTER TABLE 
`Tablename` 
CHANGE 
`columnname` 
`columnname` VARCHAR(191) 
CHARACTER SET 
utf8 
COLLATE 
utf8_general_ci 
NULL 
DEFAULT NULL;

我最近遇到了這個錯誤。 union中的列必須具有相同的collations

檢查列的collations

show full columns from <table_name>;

並更改列上的排序規則。

alter table <table_name> modify <column_name> varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci default null;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM