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”和“collat​​ion”是不一样的,请参阅编码和整理之间的区别? 。 两者都应该设置为utf-8; 通常整理应该是utf8_general_ciutf8_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');