今天寫了一個mysql批量處理數據的存儲過程,大體以下mysql
DELIMITER $$sql
USE `etb`$$測試
DROP PROCEDURE IF EXISTS `proc_exp_formp`$$ui
CREATE PROCEDURE `proc_exp_formp`()
READS SQL DATA
COMMENT '定時獲取數據進行發送公衆號操做'
BEGIN
DROP TABLE IF EXISTS tmp_table;
CREATE TEMPORARY TABLE tmp_table(id INT,opid INT,plate VARCHAR(30),uid int,icode...);編碼
INSERT INTO tmp_table(id,opid,plate,...)
SELECT pn.id,po.id opid,plate,... FROM bx_products pn,bx_product_order po
WHERE pn.id=po.pid ;code
UPDATE tmp_table tmp,bx_user_ssid ssid SET wxid=weixin_openid WHERE uid=user_id AND tmp.icode=ssid.icode;
SELECT * FROM tmp_table;
END$$orm
DELIMITER ;ci
存儲過程的修改操做等都沒提示錯誤,而後在call proc_exp_formp();unicode
拋出錯誤:1267 SQLSTATE: HY000 (ER_CANT_AGGREGATE_2COLLATIONS)table
中文意思:非法混合了校對
檢查發現是update 語句有問題。
-->一開始換衣是語句錯誤,而後見了一個實體表來測試,沒問題;
-->覺得是字段匹配出現問題,將臨時表字段和實體表的字段設置成如出一轍,仍是錯誤;
-->最後錯誤既然提示「校對」字眼,那就多是編碼,檢查發現實體表的編碼確實可能有問題,用了utf8_unicode_ci作校對,改爲utf8_general_ci仍是有問題;
-->好吧,懷疑到臨時表可能也是須要編碼才行,建表語句加上: DEFAULT CHARSET=utf8。
搞定。
小結:mysql創建的臨時表,可能會存在用默認的西方其餘編碼,與實體表校對不上。