diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index 77d0c31aa6dda..885f61446920a 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1614,9 +1614,9 @@ php_mysqlnd_rowp_read_text_protocol(MYSQLND_ROW_BUFFER * row_buffer, zval * fiel } else { uint64_t v = #ifndef PHP_WIN32 - (uint64_t) atoll((char *) p); + strtoull((char *) p, NULL, 10); #else - (uint64_t) _atoi64((char *) p); + _strtoui64((char *) p, NULL, 10); #endif bool uns = fields_metadata[i].flags & UNSIGNED_FLAG? TRUE:FALSE; /* We have to make it ASCIIZ temporarily */ diff --git a/ext/pdo_mysql/tests/unsigned_bigint.phpt b/ext/pdo_mysql/tests/unsigned_bigint.phpt new file mode 100644 index 0000000000000..17d11e58631cd --- /dev/null +++ b/ext/pdo_mysql/tests/unsigned_bigint.phpt @@ -0,0 +1,49 @@ +--TEST-- +Fixed value that is bigger than INT64_MAX will be casted to INT64_MAX rather than string. +--EXTENSIONS-- +pdo +pdo_mysql +mysqlnd +--SKIPIF-- + +--FILE-- +query("DROP TABLE IF EXISTS $tbl"); +$pdo->query("CREATE TABLE $tbl (`ubigint` bigint unsigned NOT NULL) ENGINE=InnoDB"); +$pdo->query("INSERT INTO $tbl (`ubigint`) VALUES (18446744073709551615)"); +$pdo->query("INSERT INTO $tbl (`ubigint`) VALUES (9223372036854775808)"); +$pdo->query("INSERT INTO $tbl (`ubigint`) VALUES (1)"); +$result = $pdo->query("SELECT ubigint FROM $tbl")->fetchAll(PDO::FETCH_ASSOC); +var_dump($result); +?> +--CLEAN-- + +--EXPECT-- +array(3) { + [0]=> + array(1) { + ["ubigint"]=> + string(20) "18446744073709551615" + } + [1]=> + array(1) { + ["ubigint"]=> + string(19) "9223372036854775808" + } + [2]=> + array(1) { + ["ubigint"]=> + int(1) + } +}