在MySql数据库中存储序列化对象

Son*_*ngo 9 php mysql encoding propel object-serialization

我有一个很大的php对象,我想序列化并存储在MySql数据库中.表编码是,UTF-8并且用于保存序列化对象编码的列也是UTF-8.

问题是该对象包含一个包含法语字符的文本字符串.

例如:

Merci d'avoir passé commande avec Lovre. Voici le récapitulatif de votre commande 
Run Code Online (Sandbox Code Playgroud)

当我序列化对象然后再次反序列化它时,字符串被维护并且格式正确.

但是,当我将序列化对象存储到MySql数据库然后再次检索它然后反序列化它时,字符串变为如下所示:

Merci d'avoir passé commande avec Lovre. Voici le récapitulatif de votre commande 
Run Code Online (Sandbox Code Playgroud)

将对象存储在数据库中时出现问题.

笔记:

  • 使用推进ORM存储对象.
  • 列类型是text.
  • 该字符串存储并从html文件中读取.

hak*_*kre 12

serialize二进制字符串创建的字符串,它们没有特定的字符集编码,但只是字节的"数组"(其中 - 一个字节是8位,一个八位字节).

如果您现在使用这样的字符串并告诉您的数据库它是LATIN-1编码的并且您的数据库将其存储到具有UTF-8编码的文本字段中,则数据库将透明地将编码从LATIN-1更改为UTF-8.UTF-8是一种字符集编码,对于某些字符,每个字符使用多个字节,例如您在问题中给出的那些字符é.

é然后将该字符存储é在数据库内部,这是UTF-8字节序列é.

如果现在从数据库中获取数据而未指定所需的编码,则数据库将以UTF-8的形式返回该数据.

现在unserialize有一个问题,因为二进制字符串已被修改为使其无效的方式.

相反,你需要可以告诉你的数据库,它不应该修改编码时它存储序列化的字符串,例如,通过选择正确的列类型和编码(二进制字段,BLOB -二进制大对象MySQL的文档,请参阅以及二进制类型的Propel文档) - 或者 - 从数据库中获取数据时,将charset-encoding恢复为原始格式.第一种方法(二进制字段)更好,因为它正是您正在寻找的.

对于已经以错误格式存储到数据库中的数据,您需要更正数据.要做到这一点,首先需要找出应用了哪种重新编码,例如从哪个charset到哪个charset.我认为它是LATIN-1但是没有保证.您需要查看当前应用程序数据和进程的编码以查找.

找到后,将值从UTF-8编码回原始编码.


oez*_*ezi 5

确保在任何地方都使用 utf-8 - 听起来你错过了一些东西。

在您的情况下,我认为您忘记为您的数据库连接设置正确的字符集(使用SET NAMES语句或mysql_set_charset())-但是如果没有看到您的代码就很难说(我不知道推进)。

以下是chazomaticus的引述,他从头到尾UTF-8给出了完美的答案,列出了您必须注意的所有要点:

贮存:

  • utf8_unicode_ci在数据库中的所有表和文本列上指定(或等效)排序规则。这使得 MySQL 在 UTF-8 中以物理方式存储和检索本机值。

恢复:

  • 在 PHP 中,无论您使用什么 DB 包装器,您都需要将连接字符集设置为 utf8。这样,当 MySQL 将数据传递给 PHP 时,它不会从其原生 UTF-8 进行转换。* 请注意,如果您不使用 DB 包装器,您可能需要发出一个查询来告诉 MySQL 以 UTF-8 格式为您提供结果:(SET NAMES 'utf8' 一旦连接)。

送货:

  • 您必须告诉 PHP 向客户端提供正确的标头,因此文本将被解释为 UTF-8。在 PHP 中,您可以使用default_charset php.ini 选项,也可以Content-Type自己手动发出 标头,这样工作量更大,但效果相同。

提交:

  • 您希望浏览器发送给您的所有数据都采用 UTF-8 格式。不幸的是,可靠地做到这一点的唯一方法是将accept-charset属性添加 到所有 <form>标签中:<form ... accept-charset="UTF-8">.
  • 请注意,W3C HTML 规范说客户端“应该”默认以服务器提供的任何字符集将表单发送回服务器,但这显然只是一个建议,因此需要对每个<form>标签进行明确。
  • 尽管在这方面,在尝试将其存储或在任何地方使用之前,您仍希望验证每个提交的字符串是否为有效的 UTF-8。PHP mb_check_encoding()可以解决问题,但您必须虔诚地使用它。

加工:

  • 不幸的是,这是困难的部分。您需要确保每次处理 UTF-8 字符串时都是安全的。最简单的方法是广泛使用 PHP 的mbstring扩展。
  • PHP 的字符串操作默认不是 UTF-8 安全的。有些事情你可以用普通的 PHP 字符串操作(比如连接)安全地做,但对于大多数事情,你应该使用等效的mbstring函数。
  • 要知道您在做什么(阅读:不要搞砸了),您确实需要了解 UTF-8 以及它在尽可能低的级别上是如何工作的。查看utf8.com 上的任何链接,获取一些好的资源,以了解您需要了解的一切。
  • 此外,我觉得这应该在某处说出来,即使它看起来很明显:您将提供的每个 PHP 或 HTML 文件都应该以有效的 UTF-8 编码。

请注意,您不需要使用 utf-8 - 重要的部分是在任何地方使用相同的字符集,而与可能的字符集无关。但是如果您无论如何都需要更改内容,请使用 utf-8。