mysqli::set_charset

mysqli_set_charset

(PHP 5 >= 5.0.5, PHP 7)

mysqli::set_charset -- mysqli_set_charsetクライアントのデフォルト文字セットを設定する

説明

オブジェクト指向型

bool mysqli::set_charset ( string $charset )

手続き型

bool mysqli_set_charset ( mysqli $link , string $charset )

データベースサーバーとのデータの送受信に使用する、 デフォルトの文字セットを設定します。

パラメータ

link

手続き型のみ: mysqli_connect() あるいは mysqli_init() が返すリンク ID。

charset

デフォルトとして設定する文字セット。

返り値

成功した場合に TRUE を、失敗した場合に FALSE を返します。

注意

注意:

Windows プラットフォームでこの関数を使用するには、MySQL クライアント ライブラリのバージョン 4.1.11 以降(MySQL 5.0 の場合は 5.0.6 以降) が必要です。

注意:

文字セットを変更するにはこの方法を使うことを推奨します。 mysqli_query() で (SET NAMES utf8 などとして) 設定する方法はお勧めできません。詳細は MySQL の文字セットの概念 を参照ください。

例1 mysqli::set_charset() の例

オブジェクト指向型

<?php
$mysqli 
= new mysqli("localhost""my_user""my_password""test");

/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

printf("Initial character set: %s\n"$mysqli->character_set_name());

/* 文字セットを utf8 に変更します */
if (!$mysqli->set_charset("utf8")) {
    
printf("Error loading character set utf8: %s\n"$mysqli->error);
    exit();
} else {
    
printf("Current character set: %s\n"$mysqli->character_set_name());
}

$mysqli->close();
?>

手続き型

<?php
$link 
mysqli_connect('localhost''my_user''my_password''test');

/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
    
printf("Connect failed: %s\n"mysqli_connect_error());
    exit();
}

printf("Initial character set: %s\n"mysqli_character_set_name($link));

/* 文字セットを utf8 に変更します */
if (!mysqli_set_charset($link"utf8")) {
    
printf("Error loading character set utf8: %s\n"mysqli_error($link));
    exit();
} else {
    
printf("Current character set: %s\n"mysqli_character_set_name($link));
}

mysqli_close($link);
?>

上の例の出力は、 たとえば以下のようになります。

Initial character set: latin1
Current character set: utf8

参考

add a note add a note

User Contributed Notes 5 notes

up
4
Konstantin Rozinov
2 months ago
The comment by Claude (http://php.net/manual/en/mysqli.set-charset.php#121067) is CORRECT.

Setting the charset (it's really the encoding) like this after setting up your connection:
$connection->set_charset("utf8mb4")

FAILS to set the proper collation for the connection:

character_set_client: utf8mb4
character_set_connection: utf8mb4
character_set_database: utf8mb4
character_set_filesystem: binary
character_set_results: utf8mb4
character_set_server: utf8mb4
character_set_system: utf8
collation_connection: utf8mb4_general_ci <---- still says general
collation_database: utf8mb4_unicode_ci
collation_server: utf8mb4_unicode_ci

If you use SET NAMES, that works:
$connection->query("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");

character_set_client: utf8mb4
character_set_connection: utf8mb4
character_set_database: utf8mb4
character_set_filesystem: binary
character_set_results: utf8mb4
character_set_server: utf8mb4
character_set_system: utf8
collation_connection: utf8mb4_unicode_ci <-- now says unicode
collation_database: utf8mb4_unicode_ci
collation_server: utf8mb4_unicode_ci

Please note, that I set the following variables on the server:

Set the following to be: utf8mb4_unicode_ci

character_set_client
character_set_connection
character_set_database
character_set_results
character_set_server

collation_connection
collation_server

Set:

character-set-client-handshake = FALSE or 0
skip-character-set-client-handshake = TRUE or 1
up
4
Emmanuel Appiah
1 year ago
So in my case, I had tried changing the collation from utf8mb4_unicode_ci for mysql and had to change it to uft8_general_ci.

Then pasted :

mysqli_set_charset( $con, 'utf8');

right before I did the SELECT command.

This is my code for reading from db :

/*

$DB_SERVER="db_server_name";
$DB_USER_READER="root";
$DB_PASS_READER="passw*rd";
$DB_NAME="db_name";
$DB_PORT="port number";

$SELECT_WHAT="`name_of_column_as_in_your_table`";
$WHICH_TBL="`table_name`";
$ON_WHAT_CONDITION="`id`='7'";

*/

$con = mysqli_connect($DB_SERVER, $DB_USER_READER, $DB_PASS_READER, $DB_NAME, $DB_PORT);//this is the unique connection for the selection
   
    mysqli_set_charset( $con, 'utf8');
   
       
        $slct_stmnt = "SELECT ".$SELECT_WHAT." FROM ".$WHICH_TBL." WHERE ".$ON_WHAT_CONDITION;

    $slct_query = mysqli_query($con, $slct_stmnt);
   
        if ($slct_query==true) {
//Do your stuff here . . .
}

And it worked like a charm. All the best. The above code can work with reading chineese, russian or arabic or any international language from the database's table column holding such data.
up
5
coder at punkass dot com
11 years ago
On windows, with "stock" PHP 5.1.2, there is no set_charset function at all. One may have to replace php_mysqli.dll, and libmysql.dll with proper versions, which provided by MySQL at http://dev.mysql.com/downloads/connector/php/
up
1
claude dot pache at gmail dot com
7 months ago
Although the documentation says that using that function is preferred than using SET NAMES, it is not sufficient in case you use a collation different from the default one:

<?php
// That will reset collation_connection to latin1_swedish_ci
// (the default collation for latin1):
$mysqli->set_charset('latin1');

// You have to execute the following statement *after* mysqli::set_charset()
// in order to get the desired value for collation_connection:
$mysqli->query("SET NAMES latin1 COLLATE latin1_german1_ci");
up
-2
robertoeyzaguirre at hotmail dot com
1 month ago
self::$cont =  new PDO( "mysql:host=".self::$dbHost.";"."dbname=".self::$dbName.";"." charset=utf8", self::$dbUsername, self::$dbUserPassword);
To Top