MySQL和PHP:带西里尔文字符的UTF-8
我试图在MySQL表中插入西里尔值,但编码有问题。
PHP的:
<?php $servername = "localhost"; $username = "a"; $password = "b"; $dbname = "c"; $conn = new mysqli($servername, $username, $password, $dbname); mysql_query("SET NAMES 'utf8';"); mysql_query("SET CHARACTER SET 'utf8';"); mysql_query("SET SESSION collation_connection = 'utf8_general_ci';"); if ($conn->connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "UPDATE `c`.`mainp` SET `search` = 'test тест' WHERE `mainp`.`id` =1;"; if ($conn->query($sql) === TRUE) { } $conn->close(); ?>
MySQL的:
| id | search | | 1 | test ав |
注意:PHP文件是utf-8
,数据库sorting规则是utf8_general_ci
您在这里混合API,
mysql_*
和mysqli_*
不会混合。 你应该坚持使用mysqli_
(因为看起来你是无论如何),因为mysql_*
函数被弃用,并且完全在PHP7中被移除。
您的实际问题是某处的字符集问题。 这里有几个可以帮助您为应用程序获取正确字符集的指针。 这涵盖了开发PHP / MySQL应用程序时可能遇到的大多数常见问题。
- 整个应用程序中的所有属性必须设置为UTF-8
- 将文档另存为UTF-8(不带BOM)(如果您使用的是Notepad ++,
Format
– >Convert to UTF-8 w/o BOM
) -
PHP和HTML中的标题都应该设置为UTF-8
-
HTML (在
<head></head>
标签内):<meta charset="UTF-8">
-
PHP (在你的文件的顶部,任何输出之前):
header('Content-Type: text/html; charset=utf-8');
-
-
连接到数据库后,将字符集设置为UTF-8作为连接对象,如下所示(直接连接后)
mysqli_set_charset($conn, "utf8"); /* Procedural approach */ $conn->set_charset("utf8"); /* Object-oriented approach */
这是为
mysqli_*
,对于mysql_*
和PDO有类似的(参见本答案的底部)。 -
还要确保你的数据库和表都设置为UTF-8,你可以这样做:
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
(任何已经存储的数据都不会被转换成正确的字符集,所以你需要用一个干净的数据库来完成这个工作,或者如果有错误的字符,那么在完成之后再更新数据)。
- 如果您使用的是
json_encode()
,则可能需要应用JSON_UNESCAPED_UNICODE
标志,否则会将特殊字符转换为其hex等效字符。
请记住,整个代码pipe道中的一切都需要设置为UFT-8,否则在应用程序中可能会遇到破碎的字符。
除了这个列表之外,可能还有一些函数具有用于指定字符集的特定参数。 手册会告诉你这个(一个例子是htmlspecialchars()
)。
还有多字节字符的特殊function,例如: strtolower()
不会降低多字节字符,因此您必须使用mb_strtolower()
,请参阅此实时演示 。
注1 :请注意,它的某个地方标记为
utf-8
(带有短划线),而某个地方标记为utf8
(没有它)。 知道何时使用哪个是很重要的,因为它们通常是不可互换的。 例如,HTML和PHP想要utf-8
,但MySQL不。注2 :在MySQL中,“charset”和“collation”是不一样的,请参阅编码和整理之间的区别? 。 两者都应该设置为utf-8; 通常整理应该是
utf8_general_ci
或utf8_unicode_ci
,请参阅UTF-8:常规? 滨? Unicode的? 。注3 :如果你使用emojis,MySQL需要在数据库和连接
utf8mb4
字符集而不是标准的utf8
来指定。 HTML和PHP将只有UTF-8
。
用mysql_
和PDO设置UTF-8
-
PDO:这是在你的对象的DSN中完成的。 请注意
charset
属性,$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
-
mysql_
:这个和mysqli_*
非常相似,但是并不把连接对象作为第一个参数。mysql_set_charset('utf8');
解:
mysql_query("SET NAMES 'utf8';");
> $mysqli->set_charset('utf8');