Martin J. Evans wrote:
> Blake Stephens wrote:
>> Greetings all,
>>
>> I'm curious as to what would cause integers to be returned as decimal 
>> numbers after switching servers.
>>
>> I just migrated my SQL server from MSSQL 2005 to 2008 and now DBI::ODBC is 
>> returning all the INTs as decimals! Even boolean columns that used to return 
>> just 1 or 0, now return 0.00. Just the data moved; the server running the 
>> scripts hasn't changed since the move, aside from me pointing my DBI 
>> connections to the new server, literally only updating the 
>> "Server=oldserver;" to "Server=newserver". Both of my servers are Windows 
>> Server 64 2008.
>>
>> When I get back a result with an ID (primary key) it will respond with 
>> "15.00" instead of "15", for example. This makes using that number in 
>> hundreds of already written and previously working queries not work at all.
>>
>> Perl is using: "dbi:ODBC:Driver={SQL Server};" as the connection string to 
>> talk to the server and PHP is using "Driver={SQL Server};". PHP seems to be 
>> doing it too.
>>
>> Any DBI or ODBC experts out there who could shed light on why this is 
>> happening now on the new server and never before on the old? Maybe a tip or 
>> configuration change that may fix it?
>>
>> Here's an example &Dumper() dump of a hashref that's populated by int() 
>> primary keys as keys and varchar() text as their values.
>>
>> $VAR1 = {
>>           '16.00' => 'Testing manual login',
>>           '11.00' => 'post migration',
>>           '8.00' => 'inserted variable',
>>           '9.00' => 'inserted variable',
>>           '17.00' => 'some text',
>>           '4.00' => 'my text here yay',
>>           '14.00' => 'some text',
>>           '13.00' => 'some text',
>>           '7.00' => 'testing text',
>>           '6.00' => 'test',
>>           '15.00' => 'some text',
>>           '3.00' => 'my text here yay',
>>           '1.00' => 'my test',
>>           '5.00' => 'test',
>>           '10.00' => 'some text',
>>           '2.00' => 'test2',
>>           '18.00' => 'some text',
>>           '12.00' => 'some text'
>>         };
>>
>> And here's the table that it came from:
>>
>> CREATE TABLE [dbo].[Tester](
>>      [id] [int] IDENTITY(1,1) NOT NULL,
>>      [clientsemailaddress] [varchar](300) NULL,
>>      [mytext] [varchar](300) NULL,
>>      [posteddate] [datetime] NOT NULL,
>>      CONSTRAINT [PK_Tester] PRIMARY KEY CLUSTERED 
>>      (
>>              [id] ASC
>>      )
>>      WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = 
>> OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
>> ) ON [PRIMARY]
>>
>>
>> Thanks.
>> -Blake
>>
>> -Blake Stephens -
>> Web Applications Developer, Webmaster
>> University of Central Florida
>> Library Systems & Technology
>> http://library.ucf.edu/
>>
> 
> I don't think there is anything in DBD::ODBC which would cause this and
> since you are using the same DBD::ODBC in both cases this would also
> indicate this. It is however possible that the second server is
> returning a different type for the columns. You could test this by
> issuing the query and then examining the TYPE and PRECISION attributes
> for each column (see
> http://search.cpan.org/~timb/DBI-1.613/DBI.pm#Statement_Handle_Attributes).
> 
> Martin

I've had another thought. If you are using a different DSN for each
(which you probably are) there is a rather nasty international/language
setting in the ODBC Driver setup that I think forces all integers to
money types - turn it off, it is horribly flawed and breaks lots of
stuff. I think it is called something like "use regional settings when
outputting...".

Martin
-- 
Martin J. Evans
Easysoft Limited
http://www.easysoft.com

Reply via email to