簡體   English   中英

#1271-操作'UNION'的排序規則的非法混合

[英]#1271 - Illegal mix of collations for operation 'UNION'

SELECT tbl_town.area_id, 
       tbl_town.area_name    
FROM tbl_town    
WHERE city_id = 1    

UNION 

SELECT CONCAT( tbl_town.area_id, '-', tbl_town_phase.town_phase_id ), 
       CONCAT( tbl_town.area_name, '-', tbl_town_phase.town_phase_name )    
FROM tbl_town, tbl_town_phase    
WHERE tbl_town.area_id = tbl_town_phase.town_id    
AND tbl_town.city_id = 1    

UNION 

SELECT CONCAT( tbl_town.area_id, '-', tbl_town_phase.town_phase_id, '-', tbl_town_block.town_block_id ), 
       CONCAT( tbl_town.area_name, '-', tbl_town_phase.town_phase_name, '-', tbl_town_block.town_block_name )    
FROM tbl_town, tbl_town_phase, tbl_town_block    
WHERE tbl_town.area_id = tbl_town_phase.town_id    
AND tbl_town_phase.town_phase_id = tbl_town_block.town_phase_id    
AND tbl_town.city_id =1    
LIMIT 0 , 30    

MySQL說:文檔

#1271-“ UNION”操作的排序規則的非法混合

過去我也遇到過類似的問題。 它是由排序規則混合引起的,很可能是由不同的列排序規則或字符串的默認排序規則引起的。

這是你可以嘗試的

  • 檢查所有列的排序規則是否相同
  • 檢查數據庫的排序規則是否與列相同
  • 將所有列強制轉換為與數據庫相同的排序規則並運行腳本-然后在查詢中刪除排序規則以查找引起問題的列

否則查詢看起來不錯。

關於格式的一些小反饋是使用聯接以提高可讀性。 將所有表放在“ from”部分中,然后在where子句中鏈接所有內容可能會造成混淆。

錯誤清楚地說明了這一點。

您必須在列中進行相同的排序規則。 如果使用聯合UNION,請確保表和列之間的排序規則相同。

DROP PROCEDURE IF EXISTS `spConvertColumnCollation2utf8persianci`;
DELIMITER ;;
CREATE PROCEDURE spConvertColumnCollation2utf8persianci(DataBaseName VARCHAR(1000) CHARSET utf8)
BEGIN
    DECLARE Finished INT DEFAULT FALSE;
    DECLARE CN VARCHAR(500);
    DECLARE TN VARCHAR(500);
    DECLARE CL VARCHAR(3);
    DECLARE DT VARCHAR(100);
    DECLARE GetInvalidColumn CURSOR FOR SELECT c.COLUMN_NAME, c.TABLE_NAME, c.CHARACTER_MAXIMUM_LENGTH, c.DATA_TYPE FROM information_schema.COLUMNS c
                                        INNER JOIN information_schema.`TABLES` t ON (c.table_name = t.table_name)
                                        WHERE c.TABLE_SCHEMA = DataBaseName AND t.TABLE_TYPE <> 'VIEW' AND c.DATA_TYPE IN ('varchar', 'text', 'longtext') AND c.COLLATION_NAME NOT IN ('utf8_persian_ci');
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET Finished = TRUE;
    OPEN GetInvalidColumn;
    GetInvalidColumn_Loop: LOOP
        FETCH GetInvalidColumn INTO CN, TN, CL, DT;
    SET @qry = '';
    IF Finished THEN LEAVE GetInvalidColumn_Loop;
    ELSE
      SET @qry = CONCAT('ALTER TABLE ', TN, ' MODIFY COLUMN `', CN, '` ', DT,  IF(DT NOT IN ('text', 'longtext'), CONCAT(' (', CL ,') '), ''), ' CHARACTER SET utf8 COLLATE utf8_persian_ci;');
      PREPARE stmt1 FROM @qry;
      EXECUTE stmt1;  
    END IF;
    END LOOP GetInvalidColumn_Loop;
    CLOSE GetInvalidColumn;
END
;;
DELIMITER ;
  • 使用所需的排序規則名稱更改此方法

暫無
暫無

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

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