今天写了一个mysql批量处理数据的存储过程,大致如下
DELIMITER $$
USE `etb`$$
DROP PROCEDURE IF EXISTS `proc_exp_formp`$$
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 ;
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$$
DELIMITER ;
存储过程的修改操作等都没提示错误,然后在call proc_exp_formp();
抛出错误:1267 SQLSTATE: HY000 (ER_CANT_AGGREGATE_2COLLATIONS)
中文意思:非法混合了校对
检查发现是update 语句有问题。
-->一开始换衣是语句错误,然后见了一个实体表来测试,没问题;
-->以为是字段匹配出现问题,将临时表字段和实体表的字段设置成一模一样,还是错误;
-->最后错误既然提示“校对”字眼,那就可能是编码,检查发现实体表的编码确实可能有问题,用了utf8_unicode_ci做校对,改成utf8_general_ci还是有问题;
-->好吧,怀疑到临时表可能也是需要编码才行,建表语句加上: DEFAULT CHARSET=utf8。
搞定。
小结:mysql建立的临时表,可能会存在用默认的西方其他编码,与实体表校对不上。