if ($socket) {
ini_set('mysqli.default_socket', $socket);
}
+
/* Development setting: test experimal features and/or feature requests that never worked before? */
$TEST_EXPERIMENTAL = (in_array(getenv("MYSQL_TEST_EXPERIMENTAL"), array(0, 1))) ?
((1 == getenv("MYSQL_TEST_EXPERIMENTAL")) ? true : false) :
if ($flags !== false) {
$link = mysqli_init();
- $link->options(MYSQLI_SET_CHARSET_NAME, "utf8");
if (!mysqli_real_connect($link, $host, $user, $passwd, $db, $port, $socket, $flags))
$link = false;
} else {
$link = mysqli_connect($host, $user, $passwd, $db, $port, $socket);
- $link->set_charset("utf8");
}
return $link;
}
}
}
+
+ function my_get_charsets($link) {
+
+ /* Those tree are set by SET NAMES */
+ $charsets = array(
+ 'client' => NULL,
+ 'results' => NULL,
+ 'connection' => NULL,
+ );
+
+ if (!($res = mysqli_query($link, "SHOW VARIABLES LIKE '%character%'"))) {
+ printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ return $charsets;
+ }
+
+ $names = array();
+ while ($row = mysqli_fetch_assoc($res)) {
+ $names[$row['Variable_name']] = $row['Value'];
+ }
+ mysqli_free_result($res);
+
+ if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_client']))) ||
+ !($details = mysqli_fetch_assoc($res))) {
+ printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ return $charsets;
+ }
+ mysqli_free_result($res);
+
+ $charsets['client'] = array(
+ 'charset' => $details['Charset'],
+ 'desc' => $details['Description'],
+ 'collation' => $details['Default collation'],
+ 'maxlen' => $details['Maxlen'],
+ 'nr' => NULL,
+ );
+
+ if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) ||
+ !($collation = mysqli_fetch_assoc($res))) {
+ printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ return $charsets;
+ }
+ mysqli_free_result($res);
+ $charsets['client']['nr'] = $collation['Id'];
+
+ if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_results']))) ||
+ !($details = mysqli_fetch_assoc($res))) {
+ printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ return $charsets;
+ }
+ mysqli_free_result($res);
+
+ $charsets['results'] = array(
+ 'charset' => $details['Charset'],
+ 'desc' => $details['Description'],
+ 'collation' => $details['Default collation'],
+ 'maxlen' => $details['Maxlen'],
+ 'nr' => NULL,
+ );
+
+ if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) ||
+ !($collation = mysqli_fetch_assoc($res))) {
+ printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ return $charsets;
+ }
+ mysqli_free_result($res);
+ $charsets['results']['nr'] = $collation['Id'];
+
+
+ if (!($res = mysqli_query($link, sprintf("SHOW CHARACTER SET LIKE '%s'", $names['character_set_connection']))) ||
+ !($details = mysqli_fetch_assoc($res))) {
+ printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ return $charsets;
+ }
+ mysqli_free_result($res);
+
+ $charsets['connection'] = array(
+ 'charset' => $details['Charset'],
+ 'desc' => $details['Description'],
+ 'collation' => $details['Default collation'],
+ 'maxlen' => $details['Maxlen'],
+ 'nr' => NULL,
+ );
+
+ if (!($res = mysqli_query($link, sprintf("SHOW COLLATION LIKE '%s'", $details['Default collation']))) ||
+ !($collation = mysqli_fetch_assoc($res))) {
+ printf("[%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ return $charsets;
+ }
+ mysqli_free_result($res);
+ $charsets['connection']['nr'] = $collation['Id'];
+
+ return $charsets;
+ }
+
} else {
printf("skip Eeeek/BUG/FIXME - connect.inc included twice! skipif bug?\n");
}
mysqli_free_result($res);
$version = explode('.', $tmp['server_version']);
if (empty($version))
- die(sprintf("skip Cannot determine server version, need MySQL Server 4.1+ for the test!"));
+ die(sprintf("skip Cannot determine server version, we need MySQL Server 4.1+ for the test!"));
if ($version[0] <= 4 && $version[1] < 1)
- die(sprintf("ski Need MySQL Server 4.1+ for the test!"));
+ die(sprintf("skip We need MySQL Server 4.1+ for the test!"));
?>
--FILE--
<?php
require('table.inc');
+ $charsets = my_get_charsets($link);
if (!$res = mysqli_query($link, "SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
}
- while ($tmp = mysqli_fetch_field($res))
- var_dump($tmp);
+ /* ID column, binary charset */
+ $tmp = mysqli_fetch_field($res);
var_dump($tmp);
+ /* label column, result set charset */
+ $tmp = mysqli_fetch_field($res);
+ var_dump($tmp);
+ if ($tmp->charsetnr != $charsets['results']['nr']) {
+ printf("[004] Expecting charset %s/%d got %d\n",
+ $charsets['results']['charset'],
+ $charsets['results']['nr'], $tmp->charsetnr);
+ }
+ if ($tmp->length != (1 * $charsets['results']['maxlen'])) {
+ printf("[005] Expecting length %d got %d\n",
+ $charsets['results']['maxlen'],
+ $tmp->max_length);
+ }
+
+ var_dump(mysqli_fetch_field($res));
+
mysqli_free_result($res);
// Read http://bugs.php.net/bug.php?id=42344 on defaults!
if (NULL !== ($tmp = mysqli_fetch_field($res)))
- printf("[004] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
+ printf("[006] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
if (!mysqli_query($link, "DROP TABLE IF EXISTS test"))
- printf("[005] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_query($link, "CREATE TABLE test(id INT NOT NULL DEFAULT 1)"))
- printf("[006] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!mysqli_query($link, "INSERT INTO test(id) VALUES (2)"))
- printf("[007] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ printf("[009] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
if (!$res = mysqli_query($link, "SELECT id as _default_test FROM test")) {
- printf("[008] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
+ printf("[010] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
}
var_dump(mysqli_fetch_assoc($res));
+ /* binary */
var_dump(mysqli_fetch_field($res));
mysqli_free_result($res);
[%u|b%"def"]=>
%unicode|string%(0) ""
[%u|b%"max_length"]=>
- int(1)
+ int(%d)
[%u|b%"length"]=>
int(%d)
[%u|b%"charsetnr"]=>
printf("[002] Cannot connect to the server using host=%s, user=%s, passwd=***, dbname=%s, port=%s, socket=%s\n",
$host, $user, $db, $port, $socket);
- if (!$res = $mysqli->query("SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
- printf("[003] [%d] %s\n", $mysqli->errno, $mysqli->error);
- }
-
if (!is_null($tmp = @$res->fetch_field($link)))
printf("[003] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
- while ($tmp = $res->fetch_field()) {
- var_dump($tmp);
+ $charsets = my_get_charsets($link);
+
+ if (!$res = $mysqli->query("SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
+ printf("[004] [%d] %s\n", $mysqli->errno, $mysqli->error);
}
+
+ var_dump($res->fetch_field());
+
+ $tmp = $res->fetch_field();
var_dump($tmp);
+ if ($tmp->charsetnr != $charsets['results']['nr']) {
+ printf("[005] Expecting charset %s/%d got %d\n",
+ $charsets['results']['charset'],
+ $charsets['results']['nr'], $tmp->charsetnr);
+ }
+ if ($tmp->length != (1 * $charsets['results']['maxlen'])) {
+ printf("[006] Expecting length %d got %d\n",
+ $charsets['results']['maxlen'],
+ $tmp->max_length);
+ }
+
+ var_dump($res->fetch_field());
$res->free_result();
if (NULL !== ($tmp = $res->fetch_field()))
- printf("[004] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
+ printf("[007] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
$mysqli->close();
print "done!";
[%u|b%"def"]=>
%unicode|string%(0) ""
[%u|b%"max_length"]=>
- int(1)
+ int(%d)
[%u|b%"length"]=>
int(%d)
[%u|b%"charsetnr"]=>
printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
require('table.inc');
+ $charsets = my_get_charsets($link);
+
if (!$res = mysqli_query($link, "SELECT id AS ID, label FROM test AS TEST ORDER BY id LIMIT 1")) {
printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
}
$fields = mysqli_fetch_fields($res);
- foreach ($fields as $k => $field)
+ foreach ($fields as $k => $field) {
var_dump($field);
+ switch ($k) {
+ case 1:
+ /* label column, result set charset */
+ if ($field->charsetnr != $charsets['results']['nr']) {
+ printf("[004] Expecting charset %s/%d got %d\n",
+ $charsets['results']['charset'],
+ $charsets['results']['nr'], $field->charsetnr);
+ }
+ if ($field->length != (1 * $charsets['results']['maxlen'])) {
+ printf("[005] Expecting length %d got %d\n",
+ $charsets['results']['maxlen'],
+ $field->max_length);
+ }
+ break;
+ }
+ }
mysqli_free_result($res);
printf("[002] Expecting NULL, got %s/%s\n", gettype($tmp), $tmp);
require('table.inc');
+ $charsets = my_get_charsets($link);
+
if (!$res = mysqli_query($link, "SELECT id, label FROM test ORDER BY id LIMIT 1", MYSQLI_USE_RESULT)) {
printf("[003] [%d] %s\n", mysqli_errno($link), mysqli_error($link));
}
var_dump(mysqli_field_seek($res, 0));
var_dump(mysqli_fetch_field($res));
var_dump(mysqli_field_seek($res, 1));
- var_dump(mysqli_fetch_field($res));
+
+ $field = mysqli_fetch_field($res);
+ var_dump($field);
+ /* label column, result set charset */
+ if ($field->charsetnr != $charsets['results']['nr']) {
+ printf("[004] Expecting charset %s/%d got %d\n",
+ $charsets['results']['charset'],
+ $charsets['results']['nr'], $field->charsetnr);
+ }
+ if ($field->length != (1 * $charsets['results']['maxlen'])) {
+ printf("[005] Expecting length %d got %d\n",
+ $charsets['results']['maxlen'],
+ $field->max_length);
+ }
+
var_dump(mysqli_field_tell($res));
var_dump(mysqli_field_seek($res, 2));
var_dump(mysqli_fetch_field($res));
var_dump(mysqli_field_seek($res, 0));
-
-
mysqli_close($link);
print "done!";
?>
[%u|b%"def"]=>
%unicode|string%(0) ""
[%u|b%"max_length"]=>
- int(0)
+ int(%d)
[%u|b%"length"]=>
int(%d)
[%u|b%"charsetnr"]=>
--FILE--
<?php
require('table.inc');
+ $link->set_charset('latin1');
class foo {
// @var $bar string
--FILE--
<?php
require('table.inc');
+ $charsets = my_get_charsets($link);
if (!($stmt = mysqli_stmt_init($link)) ||
!mysqli_stmt_prepare($stmt, "SELECT id, label, id + 1 as _id, concat(label, '_') ___label FROM test ORDER BY id ASC LIMIT 3") ||
!mysqli_stmt_execute($stmt))
- printf("[006] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
+ printf("[001] [%d] %s\n", mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
if (!is_object($res = mysqli_stmt_get_result($stmt)) || 'mysqli_result' != get_class($res)) {
- printf("[007] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
+ printf("[002] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
}
if (!is_object($res_meta = mysqli_stmt_result_metadata($stmt)) ||
'mysqli_result' != get_class($res_meta)) {
- printf("[008] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
+ printf("[003] Expecting object/mysqli_result got %s/%s, [%d] %s\n",
gettype($res), $res, mysqli_stmt_errno($stmt), mysqli_stmt_error($stmt));
}
- $fields = array();
- while ($info = $res->fetch_field()) {
- var_dump($info);
+ $i = 0;
+ while ($field = $res->fetch_field()) {
+ var_dump($field);
+ $i++;
+ if (2 == $i) {
+ /*
+ Label column, result set charset.
+ All of the following columns are "too hot" - too server dependent
+ */
+ if ($field->charsetnr != $charsets['results']['nr']) {
+ printf("[004] Expecting charset %s/%d got %d\n",
+ $charsets['results']['charset'],
+ $charsets['results']['nr'], $field->charsetnr);
+ }
+ if ($field->length != (1 * $charsets['results']['maxlen'])) {
+ printf("[005] Expecting length %d got %d\n",
+ $charsets['results']['maxlen'],
+ $field->max_length);
+ }
+ }
}
mysqli_stmt_close($stmt);
[%u|b%"def"]=>
%unicode|string%(0) ""
[%u|b%"max_length"]=>
- int(1)
+ int(%d)
[%u|b%"length"]=>
int(%d)
[%u|b%"charsetnr"]=>
[%u|b%"def"]=>
%unicode|string%(0) ""
[%u|b%"max_length"]=>
- int(2)
+ int(%d)
[%u|b%"length"]=>
int(%d)
[%u|b%"charsetnr"]=>