我正在与遗产一起工作大泥球 http://en.wikipedia.org/wiki/Big_ball_of_mud使用一个latin1
数据库但适用于utf8
字符串。每次应用程序读取或写入数据库时,它都会进行解码或编码by hand和商店utf8
中的编码字符串latin1
数据库。
写入时,它会执行以下操作:
$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 管理同一个数据库并尊重这种奇怪的行为?
以下代码在我的应用程序中使用时将按预期工作Entity
,但我正在寻找一种更清洁、更干燥的解决方案。
public function setKey($value)
{
$this->key = utf8_encode($value);
}
public function getKey()
{
return utf8_decode($this->key);
}
您可以创建自己的自定义“字符串”类型并覆盖它的类Doctrine\DBAL\Types\Type
. Type::convertToDatabaseValue
and 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');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)