Hi Calvin,

Here are a couple of follow-up notes.

On Fri, Oct 16, 2026 at 6:27 PM Calvin Buckley <[email protected]> wrote:

> > 2. The fallback leaves each driver to choose STR or LOB, and STR
> corrupts data: pdo_pgsql reads text-format parameters as C strings
> (truncated at the first NUL), pdo_mysql loses the _binary introducer. A
> per-driver table (native bind, emulated quote, fetch) would pin this down.
>
> For drivers that use emulated prepares, perhaps we could check string
> contents instead and use binary quoting based on that, but that feels slow
> and what characters need binary quoting would differ per driver.
>

Content sniffing can't settle this. A bytea or varbinary value can be valid
text, and text can contain a NUL, so the driver has to be told. It also
doesn't help native prepares: pdo_pgsql sends text-format parameters as C
strings, so they truncate at the first NUL regardless of quoting. That's
the strongest argument for the RFC imho.


> > 3. Neither representation degrades safely. An unknown type 6 falls to
> text in the bundled drivers and pdo_oci, IM001 in pdo_ibm, and a fatal
> error in pdo_sqlsrv. A flag only survives where the type is masked with
> PDO_PARAM_TYPE(); the emulated-prepare parser, PDO::quote(), the pgsql
> quoter, fetch_value() and pdo_sqlsrv all compare the raw value. The flag
> works only if core masks it before quoting and fetch overrides; the RFC
> should require that, and define what PARAM_INT | PARAM_BINARY does
> (ValueError, I'd say).
>
> Marking this a breaking change for drivers seems reasonable then
>

The driver break decides between using a type versus a flag. A new type 6
is a fatal error in pdo_sqlsrv and IM001 in pdo_ibm until each driver ships
an update. A flag that core masks before quoting allows fetch to fall back
to STR/LOB in any driver that ignores it. I'd go with the flag, and
reject combinations
with INT/BOOL/NULL with a ValueError.


> > 5. Changing getColumnMeta()'s pdo_type breaks strict comparisons either
> way (6 or STR | BINARY). A separate key would avoid that.
>
> I suspect a BC break for things relying on getColumnMeta would happen
> regardless of strategy. We could try something like pdo_sqlite's blob key
> perhaps if we really want to avoid it.


pdo_sqlite already marks blobs in getColumnMeta()'s "flags" array, which is
a good precedent for leaving pdo_type alone.

-- 
Ilia Alshanetsky
Technologist, CTO, Entrepreneur
E: [email protected]
T: @iliaa
B: http://ilia.ws

Reply via email to