我有一个表,其中所有字段都设置为'utf8_general_ci'。表上有一个触发器,用于捕获数据更改并将其插入"日志"表中。
触发器有一个变量(var_row_data),用于存储更新行的旧数据,然后将该变量插入到日志表中。然而,每当一个特殊字符(例如łandń)是存储在触发器变量中的数据的一部分时,MySQL就会抛出异常。
我是否遗漏了一些关于触发变量及其编码的内容?连接使用的是utf8,表使用的是outf8,网页使用的是utf8。简言之MySQL可以很好地处理特殊字符,但一旦触发器尝试存储特殊字符,一切都会出错。
有人有这方面的经验吗?触发变量显然有问题,但我只是不明白如何绕过它
记录在案,这是触发因素:
DROP TRIGGER IF EXISTS `SYM_ON_U_FOR_VRBLS_WBPRD`//
CREATE TRIGGER `SYM_ON_U_FOR_VRBLS_WBPRD` AFTER UPDATE ON `variables`
FOR EACH ROW begin
DECLARE var_row_data mediumtext;
DECLARE var_old_data mediumtext;
if 1=1 and @sync_triggers_disabled is null then
set var_row_data = concat(
if(new.`id` is null,'',concat('"',cast(new.`id` as char),'"')),',',
if(new.`variable` is null,'',concat('"',replace(replace(new.`variable`,'','\'),'"','"'),'"')),',',
if(new.`value` is null,'',concat('"',replace(replace(new.`value`,'','\'),'"','"'),'"')));
set var_old_data = concat(
if(old.`id` is null,'',concat('"',cast(old.`id` as char),'"')),',',
if(old.`variable` is null,'',concat('"',replace(replace(old.`variable`,'','\'),'"','"'),'"')),',',
if(old.`value` is null,'',concat('"',replace(replace(old.`value`,'','\'),'"','"'),'"')));
if 1=1 then
insert into trackerdatabase_production_synch.sym_data (table_name, event_type, trigger_hist_id, pk_data, row_data, old_data, channel_id, transaction_id, source_node_id, external_data, create_time)
values(
'variables',
'U',
18,
concat(
if(old.`id` is null,'',concat('"',cast(old.`id` as char),'"'))
),
var_row_data,
var_old_data,
'default', trackerdatabase_production_synch.sym_transaction_id(), @sync_node_disabled,
null,
CURRENT_TIMESTAMP
);
end if;
end if;
end
//
也许:
DECLARE var_row_data MEDIUMTEXT CHARACTER SET utf8;