PHP <==> MySQL; 在数据库中存储西里尔/斯堪的纳维亚字符

php*_*015 3 php mysqli utf-8 character-encoding cyrillic

有很多帖子专门讨论这个主题,我觉得问这个问题很愚蠢。

\n\n

但是,我完全不知道问题出在哪里。

\n\n

我正在尝试通过 PHP (html) 表单将特殊字符(西里尔文、斯堪的纳维亚文等)插入 MySQL 数据库。

\n\n

字符如:\xc3\x84、\xc3\x96、\xc3\x85,以及俄语字母等。

\n\n

根据本论坛之前的帖子,我尝试了以下所有操作(在 MySQL 数据库连接字符串之后插入):

\n\n
    mysqli->set_charset("utf8");\n
Run Code Online (Sandbox Code Playgroud)\n\n

这不起作用,所以我尝试了以下方法:

\n\n
    mysqli_query("set names \'utf8\'");\n    mysqli_query("set charset \'utf8\'");\n
Run Code Online (Sandbox Code Playgroud)\n\n

PHP 不推荐这些。但是,无论如何我都尝试过,但仍然没有运气。

\n\n

(我所有的数据库、表和列都整理为: UTF8_general_ci)

\n\n

此外,我所有的 html 表单都有以下内容:

\n\n
  <meta charset="utf-8">\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以,我完全不知道自己做错了什么。一旦数据被发送到数据库,它就会(在数据库本身中)显示为垃圾字符(问号和其他象形文字)。

\n\n

然而,有趣的是:

\n\n

(a) 当我在我的网站上查看数据时,它显示正确;

\n\n

(b) 当数据在电子邮件正文中发送时,它也能正确显示

\n\n

那么......为什么它在数据库本身中无法正确显示?

\n

Qir*_*rel 5

处理特定字符集(如 UTF-8)时,将整行代码设置为相同的字符集非常重要。以下是如何遵循这一点的一些指导。

  • 所有属性必须设置为ut8(排序规则与数据库中的字符集不同)
  • 您应该将文档本身保存为 UTF-8(如果您使用的是 Notepad++,则格式 ->转换为 UFT-8(或 UTF-8 w/o BOM),这是有区别的 - 两者或其中之一可能适合您)
  • PHP 和 HTML 中的标头都应设置为 UTF-8:
    • HTML:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    • PHP:header('Content-Type: text/html; charset=utf-8');
  • 连接到数据库后,将字符集设置为UTF-8,如下所示:(
    $connection->set_charset("utf8");连接后立即)
  • 还要确保您的数据库和表设置为 UTF-8,您可以通过以下查询来做到这一点(在数据库中,只需执行一次):

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

请记住,所有内容都需要设置为 UFT-8 字符代码。如果某些内容可以设置为 UFT-8(或其他字符集,请检查 PHP 文档 (php.net)),则应将其设置为与其他所有内容相同的字符集。