2

我正在使用一个使用数据库但使用字符串的遗留大泥球每次应用程序读取或写入数据库时​​,它都会手动解码或编码,并将编码的字符串存储在数据库中。latin1utf8utf8latin1

编写时,它会执行以下操作:

$value = utf8_encode("Iñtërnâtiônàlizætiøn")
mysql_query("INSERT INTO table (key) VALUES ($value)")

所以存储的值是Iñtërnâtiônà lizætiøn

阅读时:

$result = mysql_query("SELECT key FROM table")
$value = utf8_decode($result) // Wich results on "Iñtërnâtiônàlizætiøn" again

如何使用 Doctrine 2 管理同一个数据库并尊重这种奇怪的行为?

以下代码在 my 中使用时将按预期工作Entity,但我正在寻找更清洁和干燥的解决方案。

public function setKey($value)
{
    $this->key = utf8_encode($value);
}

public function getKey()
{
    return utf8_decode($this->key);
}
4

1 回答 1

3

您可以创建自己的自定义“字符串”类型并覆盖它在Doctrine\DBAL\Types\Type. Type::convertToDatabaseValue并且Type::convertToPHPValue将是您想要覆盖的内容。

<?php
use Doctrine\DBAL\Types\StringType;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class Utf8StringType extends StringType
{
    /**
     * {@inheritdoc}
     */
    public function convertToDatabaseValue($value, AbstractPlatform $p)
    {
        // convert from utf8 to latin1
        return mb_convert_encoding($value, 'ISO-8859-1', 'UTF-8');
    }

    /**
     * {@inheritdoc}
     */
    public function convertToPHPValue($value, AbstractPlatform $p)
    {
        // convert from latin1 to utf8
        return mb_convert_encoding($value, 'UTF-8', 'ISO-8859-1');
    }
}

然后将类型放入 Doctrine 中用新名称或替换字符串类型:

<?php
\Doctrine\DBAL\Types\Type::addType('utf8string', 'Utf8StringType');
// replace the default string type
\Doctrine\DBAL\Types\Type::overrideType('string', 'Utf8StringType');
于 2013-12-31T16:11:45.930 回答