summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rwxr-xr-xext/pdo_mysql/mysql_driver.c7
-rwxr-xr-xext/pdo_mysql/php_pdo_mysql_int.h4
-rw-r--r--ext/pdo_mysql/tests/mysql_pdo_test.inc4
-rw-r--r--ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt34
5 files changed, 49 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 3d72f72d51..c1fce02078 100644
--- a/NEWS
+++ b/NEWS
@@ -68,6 +68,8 @@
server mode. (Gustavo)
- PDO MySQL driver:
+ . Implemented FR #47802 (Support for setting character sets in DSN strings).
+ (Kalle)
. Fixed bug #53551 (PDOStatement execute segfaults for pdo_mysql driver).
(Johannes)
diff --git a/ext/pdo_mysql/mysql_driver.c b/ext/pdo_mysql/mysql_driver.c
index c94ac69530..e32d9224f0 100755
--- a/ext/pdo_mysql/mysql_driver.c
+++ b/ext/pdo_mysql/mysql_driver.c
@@ -711,6 +711,13 @@ static int pdo_mysql_handle_factory(pdo_dbh_t *dbh, zval *driver_options TSRMLS_
#endif
}
+#ifdef PDO_MYSQL_HAS_CHARSET
+ if (vars[0].optval && mysql_options(H->server, MYSQL_SET_CHARSET_NAME, vars[0].optval)) {
+ pdo_mysql_error(dbh);
+ goto cleanup;
+ }
+#endif
+
dbname = vars[1].optval;
host = vars[2].optval;
if(vars[3].optval) {
diff --git a/ext/pdo_mysql/php_pdo_mysql_int.h b/ext/pdo_mysql/php_pdo_mysql_int.h
index 6192b7238d..94ab41fddc 100755
--- a/ext/pdo_mysql/php_pdo_mysql_int.h
+++ b/ext/pdo_mysql/php_pdo_mysql_int.h
@@ -33,6 +33,10 @@
# define PDO_MYSQL_PARAM_BIND MYSQL_BIND
#endif
+#if (MYSQL_VERSION_ID >= 40113 && MYSQL_VERSION_ID < 50000) || MYSQL_VERSION_ID >= 50007 || defined(MYSQL_USE_MYSQLND)
+# define PDO_MYSQL_HAS_CHARSET
+#endif
+
#if defined(PDO_USE_MYSQLND) && PHP_DEBUG && !defined(PHP_WIN32)
#define PDO_DBG_ENABLED 1
diff --git a/ext/pdo_mysql/tests/mysql_pdo_test.inc b/ext/pdo_mysql/tests/mysql_pdo_test.inc
index 01c4cb9aaf..a3ffd5b9cc 100644
--- a/ext/pdo_mysql/tests/mysql_pdo_test.inc
+++ b/ext/pdo_mysql/tests/mysql_pdo_test.inc
@@ -4,9 +4,9 @@ require_once(dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc');
class MySQLPDOTest extends PDOTest {
- static function factory($classname = 'PDO', $drop_test_tables = false, $myattr = null) {
+ static function factory($classname = 'PDO', $drop_test_tables = false, $myattr = null, $mydsn = null) {
- $dsn = self::getDSN();
+ $dsn = self::getDSN($mydsn);
$user = PDO_MYSQL_TEST_USER;
$pass = PDO_MYSQL_TEST_PASS;
$attr = getenv('PDOTEST_ATTR');
diff --git a/ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt b/ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt
new file mode 100644
index 0000000000..b7e6ab440c
--- /dev/null
+++ b/ext/pdo_mysql/tests/pdo_mysql_connect_charset.phpt
@@ -0,0 +1,34 @@
+--TEST--
+PDO_MYSQL: Defining a connection charset in the DSN
+--SKIPIF--
+<?php
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
+require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+MySQLPDOTest::skip();
+?>
+--FILE--
+<?php
+ /* TODO: remove this test after fix and enable the BIT test in pdo_mysql_types.phpt again */
+ require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
+
+ /* Connect to mysql to determine the current charset so we can diffinate it */
+ $link = MySQLPDOTest::factory();
+ $charset = $link->query("SHOW VARIABLES LIKE 'character_set_connection'")->fetchObject()->value;
+
+ /* Make sure that we don't attempt to set the current character set to make this case useful */
+ $new_charset = ($charset == 'latin1' ? 'ascii' : 'latin1');
+
+ /* Done with the original connection, create a second link to test the character set being defined */
+ unset($link);
+
+ $link = MySQLPDOTest::factory('PDO', false, null, Array('charset' => $new_charset));
+ $conn_charset = $link->query("SHOW VARIABLES LIKE 'character_set_connection'")->fetchObject()->value;
+
+ if ($charset !== $conn_charset) {
+ echo "done!\n";
+ } else {
+ echo "failed!\n";
+ }
+?>
+--EXPECTF--
+done! \ No newline at end of file