@zep_v

Mysql. Почему поля с содержанием кириллицы возвращают NULL в функции при работе с Cursor?

Имеется таблица table1 с записями типа:
TITLE			CODE
Действует		 active

, т.е. столбец TITLE содержит исключительно текст на кириллицы, CODE - латиница.
Выполняем запрос
select TITLE, CODE from table1
получаем ожидаемые результаты, все работает как часы.

Использую функцию
begin 
DECLARE  cur_end   INT;
declare res varchar(20);
declare log varchar(50);
declare title varchar(50);
declare cur cursor for 
select title,code
      from table1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET  cur_end =1;
set cur_end = 0;
OPEN cur;
cursor_loop:LOOP
    FETCH cur INTO title,log;
    IF cur_end=1 THEN
         LEAVE cursor_loop;
    END IF;
    set res =concat(res,log, title);
END LOOP cursor_loop;
CLOSE cur;
return res;
end

Из доков почерпнул - concat возвратит NULL если хоть 1 из параметров NULL.
Результат функции выше - NULL.
Методом проб и ошибок выяснялось следующие, функция
...
cursor_loop:LOOP
    FETCH cur INTO title,log;
    IF cur_end=1 THEN
         LEAVE cursor_loop;
    END IF;
   set res =concat(res, title);
END LOOP cursor_loop;
CLOSE cur;

return res;
...

возвращает NULL, а функция
...
cursor_loop:LOOP
    FETCH cur INTO title,log;
    IF cur_end=1 THEN
         LEAVE cursor_loop;
    END IF;
   set res =concat(res,log);
END LOOP cursor_loop;
CLOSE cur;

return res;
...

возвращает - active.

Проверил на нескольких таблицах в БД, где имеются русские символы - CURSOR возвращает null.
charset ngix utf8, charset сервера mysql UTF-8, база и таблицы utf8 general ci, все эксперименты проводил на phpMyAdmin 3.5.0.

Я что-то делаю не так?
Подскажите пожалуйста.
  • Вопрос задан
  • 2767 просмотров
Решения вопроса 1
@zep_v Автор вопроса
Ошибка вызвана одинаковой переменной title
declare title varchar(50);
и таким же именем столбца в запросе
select title,code
      from table1;


Решение
declare titleres varchar(50);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Можно вместо concat(res, title) написать concat(IFNULL(res, ''), IFNULL(title, ''))

В этом случае, если title или res будут NULL, вместо NULL подставится пустая строка, и concat нормально отработает.

А по поводу кодировки я ничего наверное не подскажу.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы