5

I am migrating my site into php mysqli from php mysql_* methods.

I had following code that did the job:

mysql_query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'");

Without this query my string characters (in Georgian language) were written with question marks. For example it was written ????????? instead of გამარჯობა

So since it did its job I was happy, but now I cannot do the same with mysqli.

$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'");

Can anyone please help me out? Thanks.

Cœur
  • 37,241
  • 25
  • 195
  • 267
Davit
  • 1,394
  • 5
  • 21
  • 47

4 Answers4

17

It is not recommended to use mysqli query in order to set names but rather mysqli::set_charset

$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->set_charset("utf8");
J-16 SDiZ
  • 26,473
  • 4
  • 65
  • 84
Samuel Cook
  • 16,620
  • 7
  • 50
  • 62
  • if (!$mysqli->set_charset("utf8")) { printf("Error loading character set utf8: %s\n", $mysqli->error); } else { printf("Current character set: %s\n", $mysqli->character_set_name()); } but does not work. – Davit Nov 17 '12 at 19:03
  • OK I made it into work. GREAT THANK YOU. I will accept your answer ASAP. – Davit Nov 17 '12 at 19:08
1

You can use mysqli_set_charset

This is the preferred way to change the charset. Using mysqli_query() to set it (such as SET NAMES utf8) is not recommended.

However, to set collation, you will still have to use the SET NAMES query.

Anirudh Ramanathan
  • 46,179
  • 22
  • 132
  • 191
1

http://php.net/manual/en/mysqli.set-charset.php

or

mysqli->set_charset("utf8")

ro0ter
  • 439
  • 2
  • 11
1

A PHP feature request/bug report was filed...

See https://bugs.php.net/bug.php?id=52267 which garnered the response from uw@php.net:

...use mysqli_set_charset() to set the charset and then SET NAMES to change the collation.

He/she also links to http://dev.mysql.com/doc/refman/5.1/en/mysql-set-character-set.html

This function is used to set the default character set for the current connection. The string csname specifies a valid character set name. The connection collation becomes the default collation of the character set. This function works like the SET NAMES statement, but also sets the value of mysql->charset, and thus affects the character set used by mysql_real_escape_string()

And I'll link to http://dev.mysql.com/doc/refman/5.6/en/charset-collate.html which shows how to make queries using whatever collation suits that query.

With the COLLATE clause, you can override whatever the default collation is for a comparison. COLLATE may be used in various parts of SQL statements. Here are some examples:

  • With ORDER BY:
    SELECT k FROM t1 ORDER BY k COLLATE latin1_german2_ci;

  • With AS:
    SELECT k COLLATE latin1_german2_ci AS k1 FROM t1 ORDER BY k1;

  • With GROUP BY:
    SELECT k FROM t1 GROUP BY k COLLATE latin1_german2_ci;

  • With aggregate functions:
    SELECT MAX(k COLLATE latin1_german2_ci) FROM t1;

  • With DISTINCT:
    SELECT DISTINCT k COLLATE latin1_german2_ci FROM t1;

  • With WHERE:
    SELECT * FROM t1 WHERE _latin1 'Müller' COLLATE latin1_german2_ci = k; SELECT * FROM t1 WHERE k LIKE _latin1 'Müller' COLLATE latin1_german2_ci;

  • With HAVING:
    SELECT k FROM t1 GROUP BY k HAVING k = _latin1 'Müller' COLLATE latin1_german2_ci;

Fred Gandt
  • 4,217
  • 2
  • 33
  • 41