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\nDROP 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//\nRun Code Online (Sandbox Code Playgroud)\n