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()

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("Не удалось подключиться: %s\n"mysqli_connect_error());
    exit();
}

/* изменение набора символов на utf8 */
if (!$mysqli->set_charset("utf8")) {
    
printf("Ошибка при загрузке набора символов utf8: %s\n"$mysqli->error);
} else {
    
printf("Текущий набор символов: %s\n"$mysqli->character_set_name());
}

$mysqli->close();
?>

Процедурный стиль

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

/* проверка соединения */
if (mysqli_connect_errno()) {
    
printf("Не удалось подключиться: %s\n"mysqli_connect_error());
    exit();
}

/* изменение набора символов на utf8 */
if (!mysqli_set_charset($link"utf8")) {
    
printf("Ошибка при загрузке набора символов utf8: %s\n"mysqli_error($link));
} else {
    
printf("Текущий набор символов: %s\n"mysqli_character_set_name($link));
}

mysqli_close($link);
?>

Результат выполнения данных примеров:

Текущий набор символов: utf8

Смотрите также

Коментарии

Автор:
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.
2016-03-20 19:46:51
http://php5.kiev.ua/manual/ru/mysqli.set-charset.html
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");
2017-05-11 11:01:37
http://php5.kiev.ua/manual/ru/mysqli.set-charset.html
Автор:
The comment by Claude (mysqli.set-charset#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
2017-09-18 05:20:14
http://php5.kiev.ua/manual/ru/mysqli.set-charset.html
Note that using utf8mb4 with this function may cause this function to return false, depending on the MySQL client library compiled into PHP. If the client library is older than the introduction of utf8mb4, then PHP's call of the libraries 'mysql_set_character_set' will return an error because it won't recognise that character set.

The only way you will know there's an error is by checking the return value, because PHP warnings are not emitted by this function.
mysqli_error will return something like:
"Can't initialize character set utf8mb4 (path: /usr/share/mysql/charsets/)"
(I don't think the directory has anything to do with it; I think the utf8mb4 vs utf8 distinction is handled internally)

A workaround is to recall with utf8, then do a 'SET NAMES' query with utf8mb4.

If your MySQL server is configured to use utf8 by default, then you may not notice any of this until you get obscure bugs. It seems it will still save into the database correctly in terms of bytes. However, you may get "Data too long for column" errors if you are truncating strings to fit fields, because from MySQL's point of view during the length check every 4-byte character will actually be multiple individual characters. This caused me hours of debugging.
2018-01-03 21:30:39
http://php5.kiev.ua/manual/ru/mysqli.set-charset.html
To align both the character set (e.g., utf8mb4) AND the collation sequence with the schema (database) settings:

<?php
$mysqli 
= new mysqliDB_HOSTDB_USERDB_PASSWORDDB_SCHEMADB_PORT );
if ( 
!== $mysqli->connect_errno )
    throw new 
\Exception$mysqli->connect_error$mysqli->connect_errno );

if ( 
TRUE !== $mysqli->set_charset'utf8mb4' ) )
    throw new 
\Exception$mysql->error$mysqli->errno );

if ( 
TRUE !== $mysqli->query'SET collation_connection = @@collation_database;' ) )
    throw new 
\Exception$mysql->error$mysqli->errno );
?>

To confirm:

<?php 
echo 'character_set_name: '$mysqli->character_set_name(), '<br />'PHP_EOL;
foreach( 
$mysqli->query"SHOW VARIABLES LIKE '%_connection';" )->fetch_all() as $setting )
    echo 
$setting[0], ': '$setting[1], '<br />'PHP_EOL;
?>

will output something like:
character_set_name: utf8mb4
character_set_connection: utf8mb4
collation_connection: utf8mb4_unicode_520_ci
2018-06-20 01:54:33
http://php5.kiev.ua/manual/ru/mysqli.set-charset.html

    Поддержать сайт на родительском проекте КГБ