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');