mysqli::set_charset

mysqli_set_charset

(PHP 5 >= 5.0.5, PHP 7, PHP 8)

mysqli::set_charset -- mysqli_set_charsetDéfinit le jeu de caractères du client

Description

Style orienté objet

public mysqli::set_charset(string $charset): bool

Style procédural

mysqli_set_charset(mysqli $mysql, string $charset): bool

Définit le jeu de caractères à utiliser lors de l'envoi de données depuis et vers le serveur de base de données.

Liste de paramètres

mysql

Seulement en style procédural : Un objet mysqli retourné par la fonction mysqli_connect() ou mysqli_init().

charset

Le jeu de caractères à définir.

Valeurs de retour

Cette fonction retourne true en cas de succès ou false si une erreur survient.

Erreurs / Exceptions

Si le rapport d'erreurs mysqli est activé (MYSQLI_REPORT_ERROR) et que l'opération demandée échoue, un avertissement est généré. Si, en plus, le mode est défini sur MYSQLI_REPORT_STRICT, une mysqli_sql_exception est lancée à la place.

Exemples

Exemple #1 Exemple avec mysqli::set_charset()

Style orienté objet

<?php
mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");

printf("Jeu de caractère initial : %s\n", $mysqli->character_set_name());

/* Modification du jeu de résultats en utf8mb4 */
$mysqli->set_charset("utf8mb4");

printf("Jeu de caractères courant : %s\n", $mysqli->character_set_name());
?>

Style procédural

<?php
mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');

printf("Jeu de caractère initial : %s\n", mysqli_character_set_name($link));

/* Modification du jeu de résultats en utf8mb4 */
mysqli_set_charset($link, "utf8mb4");

printf("Jeu de caractères courant : %s\n", mysqli_character_set_name($link));
?>

Les exemples ci-dessus vont afficher quelque chose de similaire à :

Jeu de caractère initial : latin1
Jeu de caractères courant : utf8mb4

Notes

Note:

C'est la meilleure façon de modifier le jeu de caractères. Il n'est pas recommandé d'utiliser la fonction mysqli_query() pour le définir (comme avec la requête SET NAMES utf8). Voir la section Concepts des jeux de caractères MySQL pour plus d'informations.

Voir aussi

add a note

User Contributed Notes 5 notes

up
28
Konstantin Rozinov
7 years 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: utf8mb4character_set_connection: utf8mb4character_set_database: utf8mb4character_set_filesystem: binarycharacter_set_results: utf8mb4character_set_server: utf8mb4character_set_system: utf8collation_connection: utf8mb4_general_ci <---- still says generalcollation_database: utf8mb4_unicode_cicollation_server: utf8mb4_unicode_ciIf you use SET NAMES, that works:$connection->query("SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci");character_set_client: utf8mb4character_set_connection: utf8mb4character_set_database: utf8mb4character_set_filesystem: binarycharacter_set_results: utf8mb4character_set_server: utf8mb4character_set_system: utf8collation_connection: utf8mb4_unicode_ci <-- now says unicodecollation_database: utf8mb4_unicode_cicollation_server: utf8mb4_unicode_ciPlease note, that I set the following variables on the server:Set the following to be: utf8mb4_unicode_cicharacter_set_clientcharacter_set_connectioncharacter_set_databasecharacter_set_resultscharacter_set_servercollation_connection collation_serverSet:character-set-client-handshake = FALSE or 0skip-character-set-client-handshake = TRUE or 1
up
18
Emmanuel Appiah
9 years 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
7
claude dot pache at gmail dot com
8 years 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
-5
ASchmidt at Anamera dot net
7 years ago
To align both the character set (e.g., utf8mb4) AND the collation sequence with the schema (database) settings:<?php$mysqli = new mysqli( DB_HOST, DB_USER, DB_PASSWORD, DB_SCHEMA, DB_PORT );if ( 0 !== $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: utf8mb4character_set_connection: utf8mb4collation_connection: utf8mb4_unicode_520_ci
up
-4
chris at ocproducts dot com
7 years ago
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.
To Top