19

I moved data from MySQL 4 (they were originally set to latin2 encoding) to MySQL 5 and set the encoding to UTF-8. It looks good in phpMyAdmin, and UTF-8 is okay. However, there are question marks instead of some characters on the website! The website encoding is also set to UTF-8, so I don’t understand where the problem is.

PHP and HTML files are also set to UTF-8.

How can I fix this?

7
  • 9
    Oh, a classic! Like the day when the last IE6 instance is deleted, I will celebrate the day when the last PHP script is moved to PHP 6. (In this far, far future I can then tell my grandchildren about the ISO-8859 monster and its sidekick named Codepage.) Commented Nov 10, 2009 at 13:05
  • im sorry but I of course tried SET NAMES 'utf8' ..on database, didnt help. :( Commented Nov 10, 2009 at 13:08
  • 1
    Well, you have to execute that query every time your script connects to the database before you execute other queries... Commented Nov 10, 2009 at 13:14
  • 3
    Related question with excellent answer on all the things you need to check: stackoverflow.com/questions/279170/utf-8-all-the-way-through Commented Nov 11, 2009 at 22:10
  • This post explains how to configure and work with UTF-8 in PHP and MySQL. Hope that saves your time. Commented Apr 17, 2014 at 15:42

11 Answers 11

30

Try the query

SET NAMES utf8

before any query in your application.

Sign up to request clarification or add additional context in comments.

5 Comments

not neccessary. Setting db encoding to utf8 and without using SET NAMES works fine for my application.
Yep, most common problem. The check your client encoding or set it with the SQL Command valya already posted. It is enough to add it before every block of statements that you send at once.
@Mauris, of course, your way is better and faster, but mine is the most simple solution which can be archieved in every language and environment without rtfm :)
Are the question marks inserted by the database or the browser? I always forget that part... ;)
This worked for me, but it was not clear exactly how this was done. Therefore I added a new answer with exact PHP syntax below.
25

On my server, adding these to my PHP file had no effect:

ini_set('default_charset', 'utf-8');
mysql_set_charset('utf8');
header('Content-type: text/html; charset=utf-8');

But everything worked perfectly once I added this to the top of my PHP file:

$mysqli->query("SET NAMES 'utf8'");

Note: I am using encoding utf8_general_ci in my database, but utf8_unicode_ci works the same for me.

3 Comments

where i can write it ?
just write it on top of your index.php file
Just edited my answer to make it more clear that these changes are made to your php file.
13

Try setting the MySQL connection to UTF-8:

SET NAMES 'utf8'

And send explicit UTF-8 headers, just in case your server has some other default settings:

header('Content-type: text/html; charset=utf-8');

Comments

2

You don't have to set your PHP and HTML files to utf-8.

You just have to set your output encoding to UTF-8 and the browser will display appropriately.

In HTML:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

In PHP:

header('Content-Type: text/html; charset=UTF-8');

When you get a string that is UTF-8 from the MySQL table, it will be UTF-8 all the way to browser output unless you convert the encoding. It's the way that the browser interprets it.

1 Comment

If you store special characters in your PHP scripts, make sure your scripts are UTF-8 encoded or they won't display correctly. Some IDEs do this automatically and it IS a requirement
2

When you show UTF-8 characters on a website, but tell the browser to interpret them as Latin-1 (or Latin-2) you see this kind of gibberish: ß

When you show Latin-1 (or Latin-2) characters on a website, but tell the browser to interpret them as UTF-8, you see question marks.

So my guess is that you switched everything to UTF-8 (I mean, you told the database engine, the web server and the browser you would be using UTF-8), but you didn't actually convert the strings to UTF-8.

Do what Darkerstar said. Convert your dump to UTF-8 (Notepad++ can do that easily) and import it again.

1 Comment

I know this is an old question. I answered for the sake of those that get here with the same problem.
2
mysql_query("SET NAMES UTF8");

Adding this line at the end of my "connection.php" solved my problem.

My connection file's complete code is:

<?php
# FileName="Connection_php_mysql.htm"
# Type="MYSQL"
# HTTP="true"
$hostname_test = "localhost";
$database_test = "test";
$username_test = "username";
$password_test = "password";
$test = mysql_pconnect($hostname_test, $username_test, $password_test) or trigger_error(mysql_error(), E_USER_ERROR);
mysql_query("SET NAMES UTF8");
?>

My database collation is "utf8_general_ci".

Pages are "dreamweaver default utf8" and "unicode normalisation form=C (Canonical Decomposition)".

1 Comment

What do you mean by "Pages are "dreamweaver default utf8""? Can you elaborate?
1

I had this problem recently (I hope it’s the same problem you are having), and I tried many ways, but at the end what worked was really simple.

Convert your dumped SQL file to UTF-8 format and then import it.

BTW: I used Notepad++ for the conversion.

Comments

1

Put a .htaccess file in your web-site root with content: AddDefaultCharset UTF-8

and

in your dbconfig set after connection to the database:

mysql_query("SET NAMES 'utf8'");

Comments

1

It doesn't seem like setting every SQL database, table, and field to UTF-8 in MySQL is good enough. Very annoying.

I ended up forcing the issue to solve encoding problems:

I had to use this every place I open the database:

$db->set_charset("utf8");

And that worked. Finally.

Comments

0

Here is a fix. Set the header to header ('Content-type: text/html; charset=utf-8'); Then print your content using utf8_decode($content). You must have the two to make it work.

1 Comment

are you sure you don't mean utf8_encode? Cause that's what finally fixed it for me.
-1

Putting:

$conn->query("SET NAMES 'utf8'");

Where $conn is my Mysqli connection in my config file helped.

3 Comments

this answer is wrong. Besides, it's a duplicate. Please don't post answers that are just duplicate existing answers
It worked for me, how is it wrong?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.