![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с русскими полями в IB6 [D5, IB6.x]
Nazareth © (2002-08-12 12:09:00)Добрый день.
Столкнулся со следующей проблемой. В базе данных есть поля, содержащие русские символы. Эти поля созданы как character set WIN1251 collate WIN1251.
Есть процедура, в которой я из одной такой таблицы возвращаю в качестве выходного параметра значение одного из таких полей.
При выполнении процедуры как в Quickdesk"е и в Delphi выскакивает ошибка "...Cannot transliterate character between character sets."
Пробовал менять collate на pxw_cyrl - не помогло.
Что делать?
Nazareth (2002-08-13 19:01:00) [1]Надо будет попробовать. Спасибо.
gray_k (2002-08-13 18:22:00) [2]У меня была такая же заморочка.
IB6 почему то не понимает wiin1251. Почему -х/з.
Я просто заново создал базу с неопределённой кодировкой (character set - none) и у всех символьных полей где стояла кодировка тоже убрал win1251. После этого всё заработало.
Nazareth (2002-08-13 17:44:00) [3]Тип поля и параметра - smallint, а ошибка звучит:
"...Cannot transliterate character between character sets."
NickBat (2002-08-13 11:10:00) [4]Ну с синтаксисом, на самом деле все нормально. :)))
А может что-то не так с grp1, тип тоже smallint?
fnatali (2002-08-13 11:05:00) [5]Синтаксис оператора Select
SELECT [TRANSACTION transaction]
[DISTINCT | ALL]
{* | <val> [, <val> …]}
[ INTO:var [, :var …]]
FROM <tableref> [, <tableref> …]
[WHERE <search_condition>]
[GROUP BY col [COLLATE collation] [, col [COLLATE collation] …]
[HAVING <search_condition>]
[UNION <select_expr> [ALL]]
[PLAN <plan_expr>]
[ORDER BY <order_list>]
[FOR UPDATE [OF col [, col …]]];
Nazareth (2002-08-13 10:45:00) [6]Не работают следующие фрагменты:
select name
from groups
where grp = :grp1
into :grp_name1;
select name
from groups
where grp = :grp2
into :grp_name2;
name, :grp_name1, :grp_name2 имеют тип varchar(50)
NickBat (2002-08-13 10:33:00) [7]Если простая выборка из таблицы работает, то ищи ошибку в процедуре. Закоментируй все и открывай по одному селекту, найдешь в каком месте ошибка.
Какой тип параметра "G" у get_graf?
select p
from get_graf("G", :grp1, :dat, :dat + 1, 288)
into :actpower;
Nazareth (2002-08-12 19:19:00) [8]Запрос Select * from groups - работает.
Привожу текст процедуры:
CREATE PROCEDURE POWERK (
DAT TIMESTAMP)
RETURNS (
ACTPOWER FLOAT,
REACTPOWER FLOAT,
KDAY FLOAT,
KMAX FLOAT,
DATEMAX TIMESTAMP,
GRP_NAME1 VARCHAR(50),
GRP_NAME2 VARCHAR(50))
AS
declare variable k float;
declare variable pk float;
declare variable grp1 smallint;
declare variable grp2 smallint;
BEGIN
for select min(grp), max(grp)
from groups
where group_type > 0
group by group_type
into :grp1, :grp2
do
begin
select name
from groups
where grp = :grp1
into :grp_name1;
select name
from groups
where grp = :grp2
into :grp_name2;
select p
from get_graf("G", :grp1, :dat, :dat + 1, 288)
into :actpower;
select p
from get_graf("G", :grp2, :dat, :dat + 1, 288)
into :reactpower;
if (actpower <> 0) then
kday = reactpower / actpower;
select distinct max(a.p / b.p)
from get_graf("G", :grp2, :dat, :dat + 1, 6) a,
get_graf("G", :grp1, :dat, :dat + 1, 6) b
where (a.dt = b.dt) and (b.p > 0) and
(b.p is not null)
into :kmax;
select distinct min(a.dt)
from get_graf("G", :grp2, :dat, :dat + 1, 6) a,
get_graf("G", :grp1, :dat, :dat + 1, 6) b
where (a.dt = b.dt) and (b.p is not null) and
((a.p - b.p * :kmax) * (a.p - b.p * :kmax) < 0.0000001)
into :datemax;
if (actpower <> 0) then
SUSPEND;
end
END
Поле name таблицы groups имеет тим varchar(50) и содержит русские символы.
NickBat (2002-08-12 16:37:00) [9]Не мешало бы текст процедуры посмотреть.
Если просто сделать Query вида: select * from table и вывести в DBGrid, это работает?
Nazareth (2002-08-12 13:25:00) [10]Размеры совпадают, но пробовал и увеличивать - не помогло...
Desdechado (2002-08-12 13:13:00) [11]размер выходного параметра меньше размера поля?
Nazareth (2002-08-12 12:53:00) [12]Никаких преобразований не делаю. Пробовал устанавливать collate при запросе - не помогло.
NickBat (2002-08-12 12:38:00) [13]А процедура случайно не делает преобразования этих строковых полей, типа upper? Если так, то лучше указать collate при открытии базы или при выполнении запросы/процедуры.
Nazareth (2002-08-12 12:20:00) [14]В Delphi указываю lc_ctype=WIN1251 - все равно ошибка.
Но она появляется и в Quickdeske.
gek (2002-08-12 12:18:00) [15]Я так понял, что указываешь lc_ctype=WIN1251 ?
Должно нормально быть.
SaS13 (2002-08-12 12:16:00) [16]в Params укажи:
lc_ctype=WIN1251
Nazareth (2002-08-12 12:13:00) [17]Указываю Russian - в тот-то и дело
gek (2002-08-12 12:12:00) [18]при соединении с базой надо указать кодировку