On Thu, Nov 4, 2010 at 7:44 PM, Richard Lynch <c...@l-i-e.com> wrote:
> On Thu, November 4, 2010 9:09 pm, Stanley Sufficool wrote:
>> On Thu, Nov 4, 2010 at 5:37 PM, Richard Lynch <c...@l-i-e.com> wrote:
>>> On Wed, November 3, 2010 8:52 pm, Stanley Sufficool wrote:
>
> I realize as the guy who has to deal with the driver code and what it
> should do for people not following the advise below, it's probably
> preaching to the choir, but...
>
> Read the below comments this way:  Anybody dumb enough to rely on the
> kind of stuff you are asking about is already in Big Trouble (tm).
>
>> I realize that non Zend types would have to be returned as a string
>> representation.
>
> At the risk of repeating myself, even Zend types aren't going to match
> up -- The devil is in the details.  The range for an INT in the DB
> won't match the range for a Zend INT, for at least some databases,
> almost for sure.  I know 2s complement is 2s complement all over, but
> there has to be SOME DB out there that has a range +/- 1 compared to
> Zend INT.
>
>> The hangups I am having is with large objects returned
>> as streams in some drivers (but not dblib)
>
> I never really use large objects, as anything that large doesn't
> belong in the database in the first place... :-)
>
> Rule Of Thumb:
> If it's a BLOB, and you aren't using it in WHERE or ORDER BY, then it
> doesn't belong in the DB.
> Put it in the custom highly-optimized specialized database engine
> commonly known as "the file system" where it belongs. :-)

FWIW, large objects cannot be used in ORDER BY in MSSQL, and
relational integrity is best achieved by having your data in a
-relational- database.

Think mugshots, digitized signatures, etc. I really do not wish to
cycle through a record set to do a pass to delete the images on disk
by filename reference and then run another SQL to delete the records.

>
>> and inconsistent date/time
>> string representations across drivers depending on server
>> configuration files (freetds.conf).
>
> Ewww...  I generally use the DB date format feature to format dates in
> a consistent manner, rather than rely on whatever random date/time
> output the DB/driver chooses.

And what ANSI SQL date conversion function would you suggest to
outputa  consistent string date/time? CAST(date as varchar)?
Inconsistent at best across MSSQL, Oracle, PostgreSQL.

>
>> Another BIG issue I am having when using strings with DBLIB is that
>> they go through iconv, destroying binary values when translated to the
>> server character set from the assumed latin1 PHP client character set.
>> SQL Server for some reason allows characters to be stored in a
>> varchar/text fields even though the character is not defined in the
>> servers code page, whereas iconv pukes with an error.
>
> I'm not an i18n expert, but...
>
> Why is iconv being injected at this point?!

Because all data on the wire from TDS is UTF16, including query strings.

>
> And why is PHP client library using latin1 for data that just isn't
> latin1?  That's just asking for problems...

Theoretically I could ask for UTF8, but then I don't want to have to
run utf8_decode/utf8_encode on all query strings, returned data, etc
when the other drivers do not return unicode to PHP.

>
> I would expect any driver to just give me the raw data from the
> database, in the charset defined by the DB, and not to try to
> down-sample it to some other charset for me...
>
> Though I guess if you've told the PHP client to make it be 'latin1'
> the best it can do is trash it through iconv and you get what asked
> for...

iconv is implemented in the freetds library outside of PHP. I guess I
could copy all of the freetds library code into pdo_dblib to avoid
iconv and external dependencies (making it a native driver)? It was a
side thought in order to get pdo_dblib working on Windows.

>
> My only answer to that is to change your code to not ask for 'latin1'
> in the first place, when the data isn't latin1.  Change the PHP client
> charset to what it ought to be, and get the data you wanted, not some
> lossy down-sampled useless conversion of the data you wanted.
>
> I cannot comment on SQL Server behaviour with respect to the "servers
> code page" [sic], whatever that is, except to say that MySQL lets you
> define your charset on a table by table basis, and, I think, in recent
> versions, even on a field by field basis. OpenSource ftw, perhaps? :-)

MSSQL allows per table and per column code pages in recent versions.
As far as OpenSource DBMS', I support what my clients run, not what I
want them to run. If I had my choice, I would be running PostgreSQL.

>
>> It would be a wonderful development to have an RFC on the preferred
>> string representation of various objects as returned by the driver so
>> that when using ANSI SQL with PDO you can expect the same
>> representation across all drivers.
>
> I'm all for documenting what SHOULD happen across all drivers, if
> a) the docs are sensible, and
> b) it can be implemented in all drivers
>
> I suspect that even a) would generate a TON of discussion on this list
> that would never be resolved, and that b) is simply not possible due
> to some really brain-dead drivers.
>
> But that's just my naive "gut" talking, with no real specific knowledge.
>
> ymmv
>
> --
> brain cancer update:
> http://richardlynch.blogspot.com/search/label/brain%20tumor
> Donate:
> https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=FS9NLTNEEKWBE
>
>
>

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to