【问题标题】:Why can't MySQL trigger variables handle special characters?为什么 MySQL 触发器变量不能处理特殊字符?
【发布时间】:2012-02-01 14:11:46
【问题描述】:

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

触发器有一个变量(var_row_data),它存储更新行的旧数据,然后将该变量插入到日志表中。但是,每次特殊字符(例如 ł 和 ń)是存储在触发器变量中的数据的一部分时,MySQL 都会以某种方式抛出异常。

我是否遗漏了有关触发器变量及其编码的内容?连接使用utf8,表格是utf8,网页是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
//

【问题讨论】:

  • 错误信息是“#​​1366 - Incorrect string value: '\xC5\x84 s"' for column 'var_row_data' at row 1”

标签: mysql encoding utf-8 triggers


【解决方案1】:

也许:

DECLARE var_row_data MEDIUMTEXT CHARACTER SET utf8;

【讨论】:

  • 我找不到触发器声明的文档。是否有任何文档定义了触发器的字符集?
  • 我认为触发器没有字符集。我认为您在其中声明的变量可以。
  • 我会试一试,然后回来更新它的进展情况。只需要想出一个简单的方法来编辑触发器。
  • 成功了!谢谢!如果您感兴趣,我已经在 SymmetricDS 的另一个论坛上写了我的问题摘要。 sourceforge.net/projects/symmetricds/forums/forum/739236/topic/…
猜你喜欢
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
相关资源
最近更新 更多