Страница 1 из 1

ошибка с blob-полем

Добавлено: 29 сен 2010, 13:09
buratino
Добрый день!
есть
в таблице т1 поле s1 определено как blob, name - varchar(32);
запрос вида
delete from name='имя' and s1='бла-бла-бла'
имею при выполнении (в программе, в ibexpert) ошибку
Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.

что я делаю не так? в faq ответа не нашел.
причем если в эксперте ограничиваю значение для s1 по длине (просто для проверки), то ошибки нет

Re: ошибка с blob-полем

Добавлено: 29 сен 2010, 14:48
Dimitry Sibiryakov
Что значит "ограничиваю значение s1 по длине"? BLOB поля ограничены только возможностями сервера.

Да и запрос "delete from name='имя'" чисто технически выполняться не может...

Re: ошибка с blob-полем

Добавлено: 29 сен 2010, 15:39
buratino
Dimitry Sibiryakov писал(а):Что значит "ограничиваю значение s1 по длине"? BLOB поля ограничены только возможностями сервера.

Да и запрос "delete from name='имя'" чисто технически выполняться не может...
ну да, конечно.
я не копировал текст, а набирал заново в тексте этого сообщения. поэтому пропустил.
на самом деле пытаюсь выполнить
delete from t1 where name='имя' and s1='...'

В s1 хранится текст sql-предложения, типа 'select s1,s2,s3,s4,..... from ..... ' - все как положено по синтаксису.
так вот, если я принудительно делаю длину меньше (укорачиваю селект, не заботясь о синтаксисе), то начиная с некоторого значения эксперт ошибку перестает выдавать.
т.е., есть какая-то зависимость от длины значения, если это blob? или с blob вообще нельзя проверять значения в where ?

Re: ошибка с blob-полем

Добавлено: 30 сен 2010, 02:47
kdv
Хоть поле s1 и блоб, все-таки сравнивается в запросе он со строкой, и больше 32к она быть никак не может. И если в эту строку запихнуть больше, то будет как раз такая ошибка.

Вообще удивляет, что Вы не можете посчитать размер этого самого = '...' когда ошибка не выдается, и когда начинает выдаваться.
То есть, фраза "начиная с некоторого значения эксперт ошибку перестает выдавать" очень замечательная. Типа, я тут чего то делаю, и ошибка то выдается, то нет. А чего делаю - непонятно.

Re: ошибка с blob-полем

Добавлено: 30 сен 2010, 11:49
buratino
kdv писал(а):Хоть поле s1 и блоб, все-таки сравнивается в запросе он со строкой, и больше 32к она быть никак не может. И если в эту строку запихнуть больше, то будет как раз такая ошибка.

Вообще удивляет, что Вы не можете посчитать размер этого самого = '...' когда ошибка не выдается, и когда начинает выдаваться.
То есть, фраза "начиная с некоторого значения эксперт ошибку перестает выдавать" очень замечательная. Типа, я тут чего то делаю, и ошибка то выдается, то нет. А чего делаю - непонятно.
могу посчитать и считал.
просто , думал что это не принципиально.
32к тут не пахнет - всего 250 байт. Т.е., оставляю в значении чуть меньше - 240 и ошибки нет.

Re: ошибка с blob-полем

Добавлено: 30 сен 2010, 13:55
Dimitry Sibiryakov
Версию сервера ты, похоже, тоже считаешь непринципиальной... А зря.

Добавлено немного погодя:
Чисто от скуки попытался воспроизвести:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type text);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
show version;
ISQL Version: WI-V2.1.1.17910 Firebird 2.1
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.1.1.17910 Firebird 2.1"
Firebird/x86/Windows NT (remote server), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
Firebird/x86/Windows NT (remote interface), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
on disk structure version 11.1
drop database;
Никаких ошибок нет. К чему бы это?..

Re: ошибка с blob-полем

Добавлено: 30 сен 2010, 14:55
buratino
Dimitry Sibiryakov писал(а):Версию сервера ты, похоже, тоже считаешь непринципиальной... А зря.

Добавлено немного погодя:
Чисто от скуки попытался воспроизвести:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type text);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
show version;
ISQL Version: WI-V2.1.1.17910 Firebird 2.1
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.1.1.17910 Firebird 2.1"
Firebird/x86/Windows NT (remote server), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
Firebird/x86/Windows NT (remote interface), version "WI-V2.1.1.17910 Firebird 2.1/XNet (SD-ACER7)/P11"
on disk structure version 11.1
drop database;
Никаких ошибок нет. К чему бы это?..
хорошо, что Вы меня так возите фейсом - следующий раз буду знать как задавать вопрос.
WinXP SP2
Firebird-1.5.5.4926
IBExpert 2010.03.25

В Expert-е такой оператор
delete from sqbd where name='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
and sq='select NAME123,12345,1234567,123,9999999999999999999999,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,'
выполняется
Plan
PLAN (SQLT NATURAL)

------ Performance info ------
Prepare time = 0ms
Execute time = 0ms

а, если добавить в конце еще '12345,'
то уже ошибка
"Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation.
"
вот я ничего и не понимаю.....
поле sq - blob.

CREATE TABLE SQBD (
ID INTEGER NOT NULL,
......
SQ BLOB SUB_TYPE 0 SEGMENT SIZE 1024,
......
);

Re: ошибка с blob-полем

Добавлено: 30 сен 2010, 15:32
Dimitry Sibiryakov
А назачем у тебя sub_type 0?.. Впрочем и с ним всё нормально:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type 0);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
delete from t where n='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
and b='select NAME123,12345,1234567,123,9999999999999999999999,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,';
show version;
ISQL Version: WI-V1.5.2.4731 Firebird 1.5
Firebird/x86/Windows NT (access method), version "WI-V1.5.2.4731 Firebird 1.5"
on disk structure version 10.1
drop database;
В-общем, давай воспроизводимый в isql пример. IBExpert - для чайников. Фтопку.

Re: ошибка с blob-полем

Добавлено: 30 сен 2010, 15:46
buratino
Dimitry Sibiryakov писал(а):А назачем у тебя sub_type 0?.. Впрочем и с ним всё нормально:

Код: Выделить всё

Use CONNECT or CREATE DATABASE to specify a database
create database "bt.fdb" user "sysdba" password "masterkey";
create table t (n varchar(40), b blob sub_type 0);
insert into t values ('abc', 'abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ');
delete from t where n='abc' and b='abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi abcdefghi ';
delete from t where n='XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
and b='select NAME123,12345,1234567,123,9999999999999999999999,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,12345,';
show version;
ISQL Version: WI-V1.5.2.4731 Firebird 1.5
Firebird/x86/Windows NT (access method), version "WI-V1.5.2.4731 Firebird 1.5"
on disk structure version 10.1
drop database;
зачем sub_type не знаю - таблица унаследованная.
более того, поскольку с firebird-ом я недавно, то я даже по синтаксису не понимаю что это.

но факт остается фактом! ошибка есть.
а isql и ibexpert одинаково себя в этом плане ведут?