kdv писал(а):1 почему база в win1251?
потому что до того все подключались с WIN1251 и в дальнейшем так будет, но в данный момент в одном из модулей программы я вынужден подключаться по UTF8.
kdv писал(а):2 у процедуры входной параметр какой чарсет имеет?
по умолчанию. т.е. чарсет базы WIN1251.
kdv писал(а):3 что если явно пересоздать процедуру, указав у всех переменных процедуры (входных и локальных) чарсет юникода?
в этом случае при подключении с UTF8 процедура работает.
но, при этом, если подключиться из другого модуля уже с WIN1251, то нет ни ругани "Malformed string", ни результата процедуры.
Чарсет(подключение) | ЧарсетSQL(сделал две переменные для текста запроса в процедуре)
-------------- | ------------
1. WIN1251 | WIN1251 - ok (нет трансляции - чарсет базы и подключения совпадают)
2. WIN1251 | UTF8 - нет результата (нет трансляции - чарсет базы и подключения совпадают)
3. UTF8 | UTF8 - ok (трансляция в чарсет базы)
4. UTF8 | WIN1251 - ошибка "Malformed string" (трансляция в чарсет базы)
т.е. execute statement считает что переданная ему строка запроса всегда в чарсете подключения и в случае несоответствия приводит к чарсету базы.
отсюда и проблема - попытка преобразования WIN1251(якобы из UTF8) в WIN1251 для (4) и отсутствие необходимого преобразования в случае (2).
получается что в процедуре необходимо анализировать с каким чарсетом подключился клиент и приводить к нему текст запроса перед передачей его execute statement.