Почему переменные триггера MySQL не могут обрабатывать специальные символы? - PullRequest
1 голос
/ 01 февраля 2012

У меня есть таблица, в которой все поля установлены в 'utf8_general_ci'.В таблице есть триггер, который фиксирует изменения данных и вставляет их в таблицу 'log'.

Триггер имеет переменную (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
//

1 Ответ

4 голосов
/ 01 февраля 2012

Возможно:

DECLARE var_row_data MEDIUMTEXT CHARACTER SET utf8;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...