2

I have a requirement to save an Order Item attribute as a string up to 400 char. While it could be implemented using a text attribute, I would rather use a varchar(400). However, the _addFlatAttribute() method in Mage_Sales_Model_Resource_Setup hardcodes the length of varchar to 255. It could be changed after the fact by a setup script with DDL, but I'm wondering if there are likely to be downstream dependencies on VARCHAR being 255 char.

Any thoughts?

4

3 に答える 3

2

インスタンス内の注文エンティティ データのサイズが拡大し続けていることを考えると、これを実行することをお勧めします。ただし、CE1.6+ はMage_Sales_Model_Resource_Setup[link]クラスを持つ最初のリリースであるため、Magento のどのバージョンに興味があります。CE1.6 より前は、クラスはMage_Sales_Model_Mysql4_Setup[link]でした。これらのクラスの列定義方法は、1.6 以降の DB に依存しないアプローチに対応するために異なるため、これは重要な違いです。

Mage_Sales_Model_Mysql4_Setup::_getAttributeColumnDefinition[リンク] :

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[リンク]

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;
}
于 2012-11-30T12:54:42.587 に答える
1

想像もできませんが、varcharのサイズを小さくすると違うかもしれません。

参照: VARCHAR(255)が(別の長さではなく)頻繁に使用されるのを見る正当な理由はありますか?

于 2012-11-30T01:33:33.567 に答える
1

VARCHAR の代わりに TEXT 型を使用します。 Mage_Sales_Model_Resource_Setupこの場合、64KB の長さを想定しています。

于 2012-11-30T13:19:02.097 に答える