【问题标题】:MySQL and PHP: UTF-8 with Cyrillic characters [duplicate]MySQL 和 PHP:带有西里尔字符的 UTF-8 [重复]
【发布时间】:2015-11-01 01:26:24
【问题描述】:

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

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

【问题讨论】:

  • 您需要停止使用mysql_query() -- PHP 的mysql_xxx() 函数已被替换:您应该使用mysqliPDO 库来代替。他们都应该使这种事情更容易使用。

标签: php mysql utf-8


【解决方案1】:

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

您的实际问题是某处的字符集问题。这里有一些提示可以帮助您为您的应用程序获取正确的字符集。这涵盖了开发 PHP/MySQL 应用程序时可能面临的大部分常见问题。

  • 整个应用程序中的ALL 属性必须设置为 UTF-8
  • 将文档另存为 UTF-8 w/o BOM(如果您使用的是 Notepad++,则为 Format -> Convert to UTF-8 w/o BOM
  • PHP 和 HTML 中的标头都应设置为 UTF-8

    • HTML(在&lt;head&gt;&lt;/head&gt; 标签内):

      <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(),请参阅此live demo

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

注意2:在MySQL中,“charset”和“collat​​ion”不是一回事,见Difference between Encoding and collation?。两者都应该设置为 utf-8;通常排序规则应该是utf8_general_ciutf8_unicode_ci,参见UTF-8: General? Bin? 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');
    

【讨论】:

  • 这就是我的答案:$conn->set_charset("utf8");谢谢!!
  • 字符集现在可以在 HTML 中使用&lt;meta charset="UTF-8"&gt; 设置
【解决方案2】:

解决方案:

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

【讨论】:

    猜你喜欢
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2012-04-01
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多