Martin, Martin J. Evans schrieb am 15.09.2010 um 11:12 (+0100): > Michael, > > When reporting issues with DBD::ODBC it is useful to know the > operating system name and version and the ODBC driver and version as > this can have a big effect.
This is on Windows XP Home SP3 using SQL Server Native Client 10.0. I was incorrect in stating that the server was SS 2005; it is SS 2008. Perl 5.12 and DBD::ODBC 1.23 are correct, though. > The XML type is not known to DBD::ODBC as a unicode type. Thanks to your investigation, we know by now that SQL_WCHAR is made available by the DBI module when importing ":sql_types". > > The following statements works correctly in SSMS (SS Management Studio): > > > > INSERT INTO T2 VALUES ('Käse', N'Käse', CAST( '<d>Käse</d>' AS XML)); > > > > Käse Käse <d>Käse</d> > > > > Now German wasn't too difficult, so let's try some Russian. > > > > INSERT INTO T2 VALUES > > ('Москва', N'Москва', CAST('<r>Москва</r>' AS XML)); > > INSERT INTO T2 VALUES > > ('Москва', N'Москва', CAST(N'<r>Москва</r>' AS XML)); > > > > ?????? Москва <r>??????</r> > > ?????? Москва <r>Москва</r> > > I think you would have found the XML column was incorrectly inserted > if you'd viewed this in SQL Server Enterprise manager - I did. I don't have that program, so I don't know. The XML column needs the N introducer, than Greek and Russian look fine. Without the N introducer, Russian is all question marks; as for Greek, *some* characters - alpha, beta, sigma, tau - are ineptly translated to their latin cousins. > > We need the N introducer for Unicode literals and a column type capable > > of receiving Unicode data. Failing any of those two, we're getting just > > a series of substitution characters (?). > > Better to use bind_param and set the type than try and set the type in > the SQL. Sounds promising! > There is good news and some not so good news (unless you can build > DBD::ODBC for your platform). > > To fix the insert bind the parameter as SQL_WCHAR (-8). $sth->bind_param( 1, $txt ); $sth->bind_param( 2, $txt ); $sth->bind_param( 3, "<u>$txt</u>", {TYPE => DBI::SQL_WCHAR} ); Gives me an error with 1.23, which has been reported here: Invalid precision value (SQL-HY104) with DBD-ODBC 1.23 http://www.martin-evans.me.uk/node/39 I'll look into upgrading. > However, the select cannot be fixed with the same trick as DBD::ODBC > does not currently act on the TYPE attribute to bind_col. I've fixed > that and can send you a new DBD::ODBC but you'll have to build it > yourself (which is easy if you are UNIX or using Strawberry Perl and > only slightly harder if you are using ActiveState on Windows assuming > it is a recentish version). Thanks. ActivePerl 5.12! > By all means RT a request to default XML columns to unicode and that > will mean you don't have to specify the TYPE in bind_param. https://rt.cpan.org/Public/Bug/Display.html?id=61370 > Below is my example which may also indicate another subtle error with > length() but I've not had time to look into it yet. Yes, I noted there was an inaccuracy - but it's not the main trouble right now. :-) To resume: * INSERT still not working because of SQL-HY104 error * SELECT will need patch Thanks a lot for your prompt and encouraging help with this issue! -- Michael Ludwig