Magento将VARCHAR属性硬编码为255长度,有什么理由不改变这个?

时间:2012-11-30 01:28:46

标签: magento attributes varchar

我需要将Order Item属性保存为最多400个字符的字符串。虽然它可以使用text属性实现,但我宁愿使用varchar(400)。但是,_addFlatAttribute()中的Mage_Sales_Model_Resource_Setup方法将varchar的长度硬编码为255.事后可以通过DDL的安装脚本更改它,但我想知道是否可能存在下游依赖项在VARCHAR上是255个字符。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我相信你会好起来的鉴于实例中订单实体数据的规模不断扩大,建议这样做。我很好奇Magento的版本,因为CE1.6 +是第一个拥有Mage_Sales_Model_Resource_Setup [link]类的版本。在CE1.6之前,课程为Mage_Sales_Model_Mysql4_Setup [link]。这是一个重要的区别,因为这些类中的列定义方法不同于1.6 +

中的数据库不可知方法

Mage_Sales_Model_Mysql4_Setup::_getAttributeColumnDefinition [link]

protected function _getAttributeColumnDefinition($code, $data)
{
    $columnDefinition = '';
    $type   = isset($data['type']) ? $data['type'] : 'varchar';
    $req    = isset($data['required']) ? $data['required'] : false;

    switch ($type) {
        case 'int':
            $columnDefinition = 'int(10) unsigned';
            break;
        case 'decimal':
            $columnDefinition = 'decimal(12,4)';
            break;
        case 'text':
            $columnDefinition = 'text';
            break;
        case 'date':
            $columnDefinition = 'datetime';
            break;
        default:
            $columnDefinition = 'varchar(255)';
            break;
    }

    if ($req) {
        $columnDefinition.= ' NOT NULL';
    }
    return $columnDefinition;
}

Mage_Sales_Model_Resource_Setup::_getAttributeColumnDefinition [link]

protected function _getAttributeColumnDefinition($code, $data)
{
    // Convert attribute type to column info
    $data['type'] = isset($data['type']) ? $data['type'] : 'varchar';
    $type = null;
    $length = null;
    switch ($data['type']) {
        case 'timestamp':
            $type = Varien_Db_Ddl_Table::TYPE_TIMESTAMP;
            break;
        case 'datetime':
            $type = Varien_Db_Ddl_Table::TYPE_DATETIME;
            break;
        case 'decimal':
            $type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
            $length = '12,4';
            break;
        case 'int':
            $type = Varien_Db_Ddl_Table::TYPE_INTEGER;
            break;
        case 'text':
            $type = Varien_Db_Ddl_Table::TYPE_TEXT;
            $length = 65536;
            break;
        case 'char':
        case 'varchar':
            $type = Varien_Db_Ddl_Table::TYPE_TEXT;
            $length = 255;
            break;
    }
    if ($type !== null) {
        $data['type'] = $type;
        $data['length'] = $length;
    }

    $data['nullable'] = isset($data['required']) ? !$data['required'] : true;
    $data['comment']  = isset($data['comment']) ? $data['comment'] : ucwords(str_replace('_', ' ', $code));
    return $data;
}

答案 1 :(得分:1)

我无法想象,如果你要减小varchar的大小,可能会有所不同。

另见: Is there a good reason I see VARCHAR(255) used so often (as opposed to another length)?

答案 2 :(得分:1)

使用TEXT类型代替VARCHAR。在这种情况下,Mage_Sales_Model_Resource_Setup假设长度为64KB。