You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3 8.7.9安装fe_login时SQLServer2012 timestamp映射异常咨询

我之前帮人处理过类似的TYPO3 + SQL Server的Doctrine映射问题,这个报错本质是Doctrine的SQLServer2012Platform没有默认支持SQL Server的timestamp类型——注意这里SQL Server的timestamp其实是rowversion,和标准SQL的timestamp不是一回事,Doctrine可能搞混了。按照Doctrine自定义映射类型的思路,你可以这么一步步来解决:

解决TYPO3 8.7.9中SQL Server timestamp类型的Doctrine映射问题

1. 创建自定义的Timestamp类型类

首先要写一个PHP类来映射SQL Server的timestamp类型,继承Doctrine的Type类。在你的TYPO3扩展里创建一个文件,比如Classes/Database/Type/TimestampType.php,内容如下:

<?php
namespace YourVendor\YourExtension\Database\Type;

use Doctrine\DBAL\Types\Type;
use Doctrine\DBAL\Platforms\AbstractPlatform;

class TimestampType extends Type
{
    public const NAME = 'timestamp';

    public function getSQLDeclaration(array $column, AbstractPlatform $platform)
    {
        // SQL Server的timestamp类型实际对应rowversion,这里直接返回'timestamp'
        return 'timestamp';
    }

    public function convertToPHPValue($value, AbstractPlatform $platform)
    {
        // 将数据库返回的二进制值转换为字符串(因为SQL Server的timestamp是二进制的rowversion)
        return is_resource($value) ? stream_get_contents($value) : $value;
    }

    public function convertToDatabaseValue($value, AbstractPlatform $platform)
    {
        // 插入时不需要手动设置,SQL Server会自动生成,所以直接返回null或者原值
        return $value;
    }

    public function getName()
    {
        return self::NAME;
    }

    public function requiresSQLCommentHint(AbstractPlatform $platform)
    {
        return true;
    }
}

2. 在TYPO3中注册这个自定义类型

接下来需要让TYPO3加载这个类型并注册到Doctrine的DBAL里。你可以在扩展的ext_localconf.php文件中添加以下代码:

<?php
defined('TYPO3_MODE') || die();

// 注册自定义的Timestamp类型
$GLOBALS['TYPO3_CONF_VARS']['DB']['customTypes']['timestamp'] = [
    'className' => \YourVendor\YourExtension\Database\Type\TimestampType::class,
    'doctrineType' => 'timestamp',
];

// 告诉SQLServer2012Platform识别这个类型
$GLOBALS['TYPO3_CONF_VARS']['DB']['platforms']['sqlsrv']['doctrineTypeMapping']['timestamp'] = 'timestamp';

注意替换YourVendor\YourExtension为你实际的扩展厂商和名称。

3. 清除缓存并测试

完成上面两步后,登录TYPO3后台,清除所有缓存(包括Doctrine的元数据缓存),然后重新尝试安装fe_login等扩展,应该就不会再抛出那个异常了。

额外说明

SQL Server的timestamp类型其实是rowversion的别名,它是一个自动生成的二进制值,用来跟踪行的修改,不是用来存储日期时间的。Doctrine默认的Timestamp类型是对应日期时间的,所以才会出现不兼容的情况,我们自定义的类型专门适配了SQL Server的这个特殊类型。


内容的提问来源于stack exchange,提问作者Benjamin Butschell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:04:12