MySQL和PHP: UTF-8加西里尔字符


MySQL and PHP: UTF-8 with Cyrillic characters

我试图在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

你在这里混合api, mysql_*mysqli_*不混合。您应该坚持使用mysqli_(因为看起来无论如何),因为mysql_*函数已被弃用,并在PHP7中完全删除。

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

  • 整个应用程序中的所有属性必须设置为UTF-8
  • 将文档保存为UTF-8 w/o 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标志,否则它会将特殊字符转换为十六进制。

请记住,整个代码管道中的所有都需要设置为UFT-8,否则您可能会在应用程序中遇到断字。

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

对于多字节字符也有特殊的函数,例如:strtolower()不会降低多字节字符,为此你必须使用mb_strtolower(),参见这个实时演示

注释1:注意它的某个地方标记为utf-8(带破折号),而某个地方标记为utf8(不带破折号)。知道什么时候使用哪一个很重要,因为它们通常是不可互换的。例如,HTML和PHP需要utf-8,但MySQL不需要。

注2:在MySQL中,"charset"answers"collation"不是一回事,参见Encoding和collation的区别?两者都应该设置为utf-8;通常排序规则应该是utf8_general_ciutf8_unicode_ci,参见UTF-8: General?本吗?Unicode ?。

注3:如果你使用表情符号,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');