这个问题已经在这里有了答案 :
UTF-8贯穿始终 (15个答案)
5个月前关闭。
我正在尝试在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,数据库排序规则utf8_general_ci
utf-8
utf8_general_ci
您在这里混的API,mysql_*并且mysqli_*不混合。您应该坚持使用mysqli_(无论如何看起来还是这样),因为mysql_*不赞成使用函数,并且在PHP7中将其完全删除了。
mysql_*
mysqli_*
mysqli_
您的实际问题是某个地方的字符集问题。这里有一些指针可以帮助您为应用程序获取正确的字符集。这涵盖了开发PHP / MySQL应用程序时可能会遇到的 大多数 一般问题。
Format
Convert to UTF-8 w/o BOM
PHP和HTML中的标头都应设置为UTF-8
HTML (内部<head></head>标签):
<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 类似的(请参见此答案的底部)。
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
请记住, 一切 的代码需要被设置为UFT-8的整条管线,否则你可能在你的应用体验破字。
除了此列表之外,可能还有一些具有用于指定字符集的特定参数的函数。手册将告诉您这一点(例如htmlspecialchars())。
htmlspecialchars()
还有一些针对多字节字符的特殊功能,例如:strtolower()不会降低多字节字符,因为您必须使用它mb_strtolower(),请参见此 实时演示 。
strtolower()
mb_strtolower()
注1 :请注意,其某处标记为utf-8(带破折号),某处标记为(无破折号utf8)。重要的是要知道什么时候使用,因为它们通常是不可互换的。例如,HTML和PHP需要utf-8,而MySQL则不需要。 注2 :在MySQL中,“字符集”和“排序规则”不是同一回事,请参见编码和排序规则之间的区别?。两者都应设置为utf-8;通常排序规则应为utf8_general_ci或utf8_unicode_ci,请参见UTF-8:常规?斌吗 Unicode?。 注意3 :如果您使用表情符号,则需要在数据库和连接中使用utf8mb4字符集而不是standard 来指定MySQL utf8。HTML和PHP将只有UTF-8。
注1 :请注意,其某处标记为utf-8(带破折号),某处标记为(无破折号utf8)。重要的是要知道什么时候使用,因为它们通常是不可互换的。例如,HTML和PHP需要utf-8,而MySQL则不需要。
utf8
注2 :在MySQL中,“字符集”和“排序规则”不是同一回事,请参见编码和排序规则之间的区别?。两者都应设置为utf-8;通常排序规则应为utf8_general_ci或utf8_unicode_ci,请参见UTF-8:常规?斌吗 Unicode?。
utf8_unicode_ci
注意3 :如果您使用表情符号,则需要在数据库和连接中使用utf8mb4字符集而不是standard 来指定MySQL utf8。HTML和PHP将只有UTF-8。
utf8mb4
UTF-8
使用mysql_和PDO 设置UTF-8
mysql_
PDO:这是在对象的DSN中完成的。注意该charset属性,
charset
$pdo = new PDO("mysql:host=localhost;dbname=database;charset=utf8", "user", "pass");
mysql_:这样做非常类似于mysqli_*,但是它没有将连接对象作为第一个参数。
mysql_set_charset('utf8');