====== PHP RFC: Driver-Specific PDO Param Types ====== * Version: 0.1 * Date: 2016-10-17 * Author: Adam Baratz adambaratz@php.net * Status: Under Discussion * First Published at: https://wiki.php.net/rfc/driver-specific-pdo-param-types ===== Introduction ===== Databases used with PDO can have nuances that fall outside the types defined by PDO (the ''PDO::PARAM_*'' consts). These nuances can't always be made transparent to the developer. A wider range of types would allow developers to create better queries. Much like PDO supports driver-specific attributes, it should also support driver-specific param types. This issue is particularly exposed to pdo_dblib users. Since pdo_dblib relies on prepared statement emulation -- DB-Library doesn't support prepared statements -- developers must build queries as they should be executed by the server. There have been a [[https://bugs.php.net/bug.php?id=60818|couple]] [[https://bugs.php.net/bug.php?id=67495|issues]] logged related to this. The current workaround is to use [[https://msdn.microsoft.com/en-us/library/ms187928.aspx|CAST]] (or implicit casts) with the existing data types. Doing so adds cost to queries. ===== Proposal ===== By adding a placeholder value to [[https://github.com/php/php-src/blob/master/ext/pdo/php_pdo_driver.h#L51|enum pdo_param_type]], PDO drivers can add types as they see fit. The PR contains two examples of how this would be used with pdo_dblib. ===== Backward Incompatible Changes ===== No modifications are needed to the supported PDO drivers, but they would have to be rebuilt against this API change. Other drivers might have to be modified if they make assumptions about the structure of ''enum pdo_param_type''. ===== Proposed PHP Version(s) ===== Next PHP 7.x. ===== New Constants ===== The example code introduces the following constants: * PDO::DBLIB_ATTR_UNICODE_STRINGS * PDO::DBLIB_PARAM_BINARY * PDO::DBLIB_PARAM_STR_UNICODE * PDO::DBLIB_PARAM_STR_ASCII ===== Proposed Voting Choices ===== This project requires a 50%+1 majority. ===== Patches and Tests ===== Working implementation, with tests: https://github.com/php/php-src/pull/2168