[Melbourne-pm] Strange things about '0'

Mathew Robertson mathew.robertson at netratings.com.au
Mon Oct 27 21:26:15 PDT 2008


>>> Now, if $query_var is a 0 then the ? in the above sql there are no 
>>> results returned from the query, but the Perl code doesn't break. 
>>> The Ingres db system must get passed a false value.
>>> If I change $query_var to be '0' to try and get the right string 
>>> into the query in the $report->execute statement it doesn't work. 
>>> Again the Perl code doesn't break, but I still don't get any results.
>>> As the I see the Camel book mentions, Perl equates 0 and '0' both to 
>>> be false. I think this is why there ar no results of both 0 and '0'.
>> Its not Perl's fault -> it (aka DBI) will be passing the literal 
>> value to the database - the database should automatically quote 
>> numeric values.  What you can do is try a simple SQL statement 
>> directly to your db, eg:
>>
>> SELECT * FROM some_table WHERE some_column = 0;
>>
>> If this doesn't fail with a bad-statement error, then your db install 
>> (like most databases), automatically quotes numeric values.
> Yep, I knew it wouldn't be Perl's fault. But I wasn't sure if it was 
> my own or not. :)
> The above SQL does fail with an error. It is on an old Ingres 2.6 
> installation. The later versions might handle numeric character to 
> integer conversion better.
>
> * select * from valid_disp where disp = 0 \g
> Executing . . .
>
> E_US1130 illegal character to integer conversion or non-numeric character
>    in money field.
well what do you know... :)

it might be worthwhile sending an email to the DBD::Ingres driver 
developer, suggesting he adds a tech-note to the perldoc, about this 
quirk.  It might even be possible that the driver could be made to 
automatically handle the conversion for you... eg: detecting when a 
literal number is used, then converting it to a string.

cheers,
Mathew


More information about the Melbourne-pm mailing list