MySQL和PHP:带有西里尔字符的UTF-8

时间:2015-08-08 18:53:28

标签: php mysql utf-8

我正在尝试在MySQL表中插入Cyrillic值,但编码存在问题。

腓:

<?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

2 个答案:

答案 0 :(得分:25)

  

您在这里混合API,mysql_*mysqli_*并不混合。您应该坚持使用mysqli_(因为它似乎无论如何),因为mysql_*函数已被弃用,并且完全在PHP7中删除。

你的实际问题是某处的字符集问题。这里有一些指示可以帮助您为您的应用程序获得正确的字符集。这涵盖了大多数在开发PHP / MySQL应用程序时可能遇到的一般问题。

  • 整个应用程序中的所有属性必须设置为UTF-8
  • 将文档保存为没有BOM的UTF-8(如果您使用的是Notepad ++,它是Format - &gt; 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');
      
  • 连接到数据库后,将charset设置为连接对象的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;
    

    (已存储的任何数据都不会转换为正确的字符集,因此您需要使用干净的数据库执行此操作,或者在执行此操作后更新数据(如果存在损坏的字符)。< / p>

  • 如果您正在使用json_encode(),则可能需要应用JSON_UNESCAPED_UNICODE标志,否则会将特殊字符转换为十六进制等效字符。

请记住,整个代码管道中的 EVERYTHING 需要设置为UFT-8,否则您的应用程序可能会遇到损坏的字符。

除了此列表之外,可能还有一些函数具有用于指定字符集的特定参数。手册会告诉你这个(例如htmlspecialchars())。

还有多字节字符的特殊功能,例如:strtolower()不会降低多字节字符,因为您必须使用mb_strtolower(),请参阅此{{3} }。

  

注意1 :请注意,它的位置标记为utf-8(带有破折号),某个位置标记为utf8(没有它)。重要的是你知道何时使用它,因为它们通常是不可互换的。例如,HTML和PHP需要utf-8,但MySQL不需要。

     

注意2 :在MySQL中,&#34; charset&#34;和&#34;整理&#34;是不一样的,见live demo。两者都应该设置为utf-8;通常整理应该是utf8_general_ciutf8_unicode_ci,请参阅Difference between Encoding and collation?

     

注3 :如果您正在使用表情符号,则需要在数据库和数据库中使用utf8mb4字符集而不是标准utf8指定MySQL连接。 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_*非常相似,但它并没有将connection-object作为第一个参数。

    mysql_set_charset('utf8');
    

答案 1 :(得分:2)

解决方案:

mysql_query("SET NAMES 'utf8';");&gt; $mysqli->set_charset('utf8');