我正在从php mysql_ *方法将我的网站迁移到php mysqli。
我有以下代码完成了这项工作:
mysql_query(" SET NAMES' utf8' COLLATE' utf8_unicode_ci'");
如果没有此查询,我的字符串字符(格鲁吉亚语)就会带有问号。 比如它写的是?????????而不是გამარჯობა
所以既然它完成了它的工作我很高兴,但现在我不能用mysqli做同样的事。
$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'");
任何人都可以帮帮我吗?感谢。
答案 0 :(得分:16)
建议不要使用mysqli查询来设置名称,而是mysqli::set_charset
$mysqli = new mysqli("localhost", "root", "", "test");
$mysqli->set_charset("utf8");
答案 1 :(得分:1)
您可以使用 mysqli_set_charset
这是更改charset的首选方法。使用mysqli_query() 不推荐设置它(例如SET NAMES utf8)。
但是,要设置排序规则,您仍然必须使用SET NAMES
查询。
答案 2 :(得分:1)
http://php.net/manual/en/mysqli.set-charset.php
或
mysqli->set_charset("utf8")
答案 3 :(得分:1)
请参阅获得uw@php.net回复的https://bugs.php.net/bug.php?id=52267:
...使用
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-collate.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;
答案 4 :(得分:-3)
$con=mysqli_connect("localhost","admin","1234","web");
$con->set_charset("utf8");