Character sets
Character sets
Character sets
Ideally a proper character set will be set at the
server level, and doing this is described within the » Character Set Configuration
section of the MySQL Server manual. Alternatively, each MySQL API
offers a method to set the character set at runtime.
The character set and character escaping
The character set should be understood and defined,
as it has an affect on every action, and includes security
implications. For example, the escaping mechanism (e.g.,
mysqli_real_escape_string() for mysqli,
mysql_real_escape_string() for mysql, and
PDO::quote() for PDO_MySQL) will adhere to
this setting. It is important to realize that these functions will
not use the character set that is defined with a query, so for
example the following will not have an effect on them:
Example #1 Problems with setting the character set with
SQL
<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");
// Will NOT affect $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8");
// Will NOT affect $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8");
// But, this will affect $mysqli->real_escape_string();
$mysqli->set_charset('utf8');
// But, this will NOT affect it (utf-8 vs utf8) -- don't use dashes here
$mysqli->set_charset('utf-8');
?>
Below are examples that demonstrate how to properly
alter the character set at runtime using each API.
Note: Possible UTF-8
confusionBecause character set names in MySQL do not contain
dashes, the string “utf8” is valid in MySQL to set the character
set to UTF-8. The string “utf-8” is not valid, as using “utf-8”
will fail to change the character set.
Example #2 Setting the character set example:
mysqli
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");
printf("Initial character set: %s\n", $mysqli->character_set_name());
if (!
$mysqli->set_charset('utf8')) {
printf("Error loading character set utf8: %s\n", $mysqli->error);
exit;
}
echo
"New character set information:\n";
print_r( $mysqli->get_charset() );
?>
Example #3 Setting the character set example: pdo_mysql
Note: This only works as of PHP 5.3.6.
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8", 'my_user', 'my_pass');
?>
Example #4 Setting the character set example:
mysql
<?php
$conn = mysql_connect("localhost", "my_user", "my_pass");
$db = mysql_select_db("world");
echo
'Initial character set: ' . mysql_client_encoding($conn) . "\n";
if (!
mysql_set_charset('utf8', $conn)) {
echo "Error: Unable to set the character set.\n";
exit;
}
echo
'Your current character set is: ' . mysql_client_encoding($conn);
?>