【问题标题】:Magento hardcodes VARCHAR attributes to 255 length, any reason to not change this?Magento 将 VARCHAR 属性硬编码为 255 长度,有什么理由不改变它?
【发布时间】:2012-11-30 01:28:45
【问题描述】:

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

有什么想法吗?

【问题讨论】:

    标签: magento attributes varchar


    【解决方案1】:

    考虑到实例中订单实体数据的规模不断扩大,我相信您会很好并且建议您这样做。不过,我很好奇 Magento 的版本,因为 CE1.6+ 是第一个具有 Mage_Sales_Model_Resource_Setup [link] 类的版本。在 CE1.6 之前,该类为 Mage_Sales_Model_Mysql4_Setup [link]。这是一个重要的区别,因为这些类中的列定义方法不同以适应 1.6+ 中与 DB 无关的方法

    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;
    }
    

    【讨论】:

    • 感谢 Ben,这是在 1.12 (EE) 中 - 单独开发模块依赖问题 :) 我认为将字段限制为 400 个字符而不是允许 65k 的 TEXT 是个好主意到行限制(我认为这就是您所指的)。
    • 啊,我被“硬编码 varchar 的长度”挂断了——正如你在上面看到的,它应该是 TEXT。在这种情况下无法指定字段的长度(没有类重写)是很遗憾的,但是您在添加后更新该列的解决方案应该可以工作。但是,请注意,如果您采用这种方法,您将更改表两次,这对于任意大的表可能是一个问题 - 通常是销售实体表的情况。
    • 关于双重更改的优点 - 意味着将表格锁定很长时间。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢 Nathan,我同意在 MySQL 方面应该没问题,我更关心的是 Magento 方面...
    • 前端的一些 PHP 页面有验证,将某些输入限制为 255 个字符,但您所做的更改不应影响这些,因为您正在添加自己的属性。不过,请确保您的 PHP 页面中也有适当的验证。
    【解决方案3】:

    使用类型 TEXT 而不是 VARCHAR。 Mage_Sales_Model_Resource_Setup 在这种情况下假定长度为 64KB。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-02
      • 2013-07-03
      • 2011-05-31
      • 2010-11-16
      • 1970-01-01
      • 2010-11-18
      • 1970-01-01
      • 2019-05-30
      相关资源
      最近更新 更多