Description:
When triggers contain string literals in cp1251 encoding, then mysqldump in its output skips the commands of the trigger from the first cp1251 character till the end of the trigger. The same is true for mysql command-line client and for the GUI Query Browser when executing SHOW TRIGGERS command.
How to repeat:
Create any trigger with cp1251 strings, e.g.:
SET NAMES cp1251;
DELIMITER //
CREATE TRIGGER trans_after_upd AFTER UPDATE ON zip.trans
FOR EACH ROW BEGIN
DECLARE a INTEGER DEFAULT 0;
DECLARE m VARCHAR(500) DEFAULT '';
SELECT auto INTO a FROM transtype tt
WHERE tt.transclass=NEW.transclass AND tt.transtype=NEW.transtype;
IF a=1 THEN
CALL calc_ledger(NEW.transid);
END IF;
IF NEW.transclass<>OLD.transclass THEN SET m=m||_cp1251'класс '; END IF;
IF NEW.transtype <>OLD.transtype THEN SET m=m||_cp1251'тип '; END IF;
IF NEW.transdate <>OLD.transdate THEN SET m=m||_cp1251'дата '; END IF;
IF NEW.amount <>OLD.amount THEN SET m=m||_cp1251'сумма '; END IF;
IF NEW.amount2 <>OLD.amount2 THEN SET m=m||_cp1251'себест. '; END IF;
IF NEW.amount_usd<>OLD.amount_usd THEN SET m=m||_cp1251'суммаUSD '; END IF;
IF NEW.amount_eur<>OLD.amount_eur THEN SET m=m||_cp1251'суммаEUR '; END IF;
IF NEW.cash <>OLD.cash THEN SET m=m||_cp1251'оплата '; END IF;
IF NEW.status_id <>OLD.status_id THEN SET m=m||_cp1251'стадия '; END IF;
IF NEW.fromplace <>OLD.fromplace THEN SET m=m||_cp1251'откуда '; END IF;
IF NEW.toplace <>OLD.toplace THEN SET m=m||_cp1251'куда '; END IF;
IF IFNULL(NEW.c_id,'') <>IFNULL(OLD.c_id,'') THEN SET m=m||_cp1251'контакт '; END IF;
IF IFNULL(NEW.ord_id,'')<>IFNULL(OLD.ord_id,'') THEN SET m=m||_cp1251'заказ '; END IF;
INSERT INTO upd_log(table_name, table_key, upd_type, emp_id, descr)
VALUES('t', NEW.transid, '=', USER(), m);
END;//
DELIMITER ;
This trigger is successfully created and works, but is shown/dumped only until the beginnig of the word "класс".