5

我正在将我的网站从 php mysql_* 方法迁移到 php mysqli。

我有以下代码可以完成这项工作:

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

如果没有这个查询,我的字符串字符(格鲁吉亚语)是用问号写的。例如它被写成????????? 而不是გამარჯობა</p>

所以既然它完成了它的工作,我很高兴,但现在我不能用 mysqli 做同样的事情。

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

谁能帮帮我?谢谢。

4

4 回答 4

17

不建议使用 mysqli 查询来设置名称,而是使用mysqli::set_charset

$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->set_charset("utf8");
于 2012-11-17T19:00:04.183 回答
1

您可以使用mysqli_set_charset

这是更改字符集的首选方法。不推荐使用 mysqli_query() 设置(如 SET NAMES utf8)。

但是,要设置排序规则,您仍然必须使用SET NAMES查询。

于 2012-11-17T19:00:31.167 回答
1

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

或者

mysqli->set_charset("utf8")

于 2012-11-17T19:01:09.610 回答
1

已提交 PHP 功能请求/错误报告...

请参阅https://bugs.php.net/bug.php?id=52267获得了来自 uw@php.net 的响应:

...用于mysqli_set_charset()设置字符集,然后SET NAMES更改排序规则。

他/她还链接到http://dev.mysql.com/doc/refman/5.1/en/mysql-set-character-set.html

该函数用于设置当前连接的默认字符集。该字符串csname指定一个有效的字符集名称。连接排序规则成为字符集的默认排序规则。此函数的作用类似于SET NAMES语句,但也设置 的值mysql->charset,从而影响 使用的字符集mysql_real_escape_string()

我将链接到http://dev.mysql.com/doc/refman/5.6/en/charset-collat​​e.html,它显示了如何使用适合该查询的任何排序规则进行查询。

使用 COLLATE 子句,您可以覆盖任何默认排序规则进行比较。COLLATE 可用于 SQL 语句的各个部分。这里有些例子:

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

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

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

  • 使用聚合函数:
    SELECT MAX(k COLLATE latin1_german2_ci) FROM t1;

  • DISTINCT
    SELECT DISTINCT k COLLATE latin1_german2_ci FROM t1;

  • 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;

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

于 2013-01-12T07:06:34.387 回答