为什么MySQL触发器变量不能处理特殊字符?

sbr*_*tla 1 mysql encoding triggers utf-8

我有一个表,其中所有字段都设置为“utf8_general_ci”。表上有一个触发器,用于捕获数据更改并将其插入到“日志”表中。

\n\n

触发器有一个变量 (var_row_data),它存储更新行的旧数据,然后将该变量插入到日志表中。然而,每当触发变量中存储的数据包含特殊字符(例如\xc5\x82 和\xc5\x84)时,MySQL 就会以某种方式引发异常。

\n\n

我是否遗漏了有关触发变量及其编码的信息?连接使用 utf8,表使用 utf8,网页使用 utf8。简而言之; MySQL 可以很好地处理特殊字符,但是一旦触发器尝试存储特殊字符,一切都会出错。

\n\n

有人对这个有经验么?显然触发变量出了问题,但我只是不明白如何解决它。

\n\n

作为记录,这里是触发器:

\n\n
DROP TRIGGER IF EXISTS `SYM_ON_U_FOR_VRBLS_WBPRD`//\nCREATE TRIGGER `SYM_ON_U_FOR_VRBLS_WBPRD` AFTER UPDATE ON `variables`\n FOR EACH ROW begin\n                                  DECLARE var_row_data mediumtext;\n                                  DECLARE var_old_data mediumtext;\n                                  if 1=1 and @sync_triggers_disabled is null then\n                                    set var_row_data = concat(\n          if(new.`id` is null,\'\',concat(\'"\',cast(new.`id` as char),\'"\')),\',\',\n          if(new.`variable` is null,\'\',concat(\'"\',replace(replace(new.`variable`,\'\\\',\'\\\\\'),\'"\',\'\\"\'),\'"\')),\',\',\n          if(new.`value` is null,\'\',concat(\'"\',replace(replace(new.`value`,\'\\\',\'\\\\\'),\'"\',\'\\"\'),\'"\')));\n                                    set var_old_data = concat(\n          if(old.`id` is null,\'\',concat(\'"\',cast(old.`id` as char),\'"\')),\',\',\n          if(old.`variable` is null,\'\',concat(\'"\',replace(replace(old.`variable`,\'\\\',\'\\\\\'),\'"\',\'\\"\'),\'"\')),\',\',\n          if(old.`value` is null,\'\',concat(\'"\',replace(replace(old.`value`,\'\\\',\'\\\\\'),\'"\',\'\\"\'),\'"\')));\n                                    if 1=1 then \n                                        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)\n                                        values(\n                                          \'variables\',\n                                          \'U\',\n                                          18,\n                                          concat(\n          if(old.`id` is null,\'\',concat(\'"\',cast(old.`id` as char),\'"\'))\n                                           ),\n                                          var_row_data,\n                                          var_old_data,\n                                          \'default\', trackerdatabase_production_synch.sym_transaction_id(), @sync_node_disabled,\n                                          null,\n                                          CURRENT_TIMESTAMP\n                                        );\n                                    end if;\n                                  end if;\n                                end\n//\n
Run Code Online (Sandbox Code Playgroud)\n

sch*_*ver 5

也许:

DECLARE var_row_data MEDIUMTEXT CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)