Saturday 9 June 2018

utf 8 - UTF-8 MySQL and Charset



Can someone explain me when I set everything to UTF-8 I keep getting those damn ���



MySQL
Server version: 5.1.44
MySQL charset: UTF-8 Unicode (utf8)




I create a new database



name: utf8test
collation: utf8_general_ci
MySQL connection collation: utf8_general_ci



My SQL looks like this:



SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

CREATE TABLE IF NOT EXISTS `test_table` (
`test_id` int(11) NOT NULL,

`test_text` text NOT NULL,
PRIMARY KEY (`test_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `test_table` (`test_id`, `test_text`) VALUES
(1, 'hééélo'),
(2, 'wööörld');


My PHP / HTML:




$db_conn = mysql_connect("localhost", "root", "") or die("Can't connect to db");
mysql_select_db("utf8test", $db_conn) or die("Can't select db");

// $result = mysql_query("set names 'utf8'"); // this works... why??
$query = "SELECT * FROM test_table";
$result = mysql_query($query);

$output = "";

while($row = mysql_fetch_assoc($result)) {
$output .= "id: " . $row['test_id'] . " - text: " . $row['test_text'] . "
";
}
?>





UTF-8 test







Answer




I set everything to UTF-8





Not quite.
You have to tell mysql your client's encoding.



As a matter of fact, you don't have to set up "everything" in utf-8. You can have your tables in latin1 and output in utf-8. Or contrary.
Very flexible.



But you have to set up client's encoding explicitly.
So, that's why it works with set names utf8. Because this query setting up client's encoding. And let Mysql know that data must be sent in utf-8. Pretty sensible, huh?



Also I have to mention your SQL dump. It needs same setting. Just SET NAMES somewhere at the top. Because you are sending these queries from some client too. And this client's encoding needs to be set up as well.




And one more thing to mention: be sure your server sending proper encoding in the Content-type header. You didn't set it to UTF-8 too.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...