Magento将VARCHAR属性硬编码为255长度,有没有理由不更改?
我需要将订单项属性保存为最多400个字符的字符串。虽然可以使用文本属性实现,但我更愿意使用varchar(400)。但是,Magento将VARCHAR属性硬编码为255长度,有没有理由不更改?,magento,attributes,varchar,Magento,Attributes,Varchar,我需要将订单项属性保存为最多400个字符的字符串。虽然可以使用文本属性实现,但我更愿意使用varchar(400)。但是,Mage\u Sales\u Model\u Resource\u设置中的\u addFlatAttribute()方法将varchar的长度硬编码为255。它可以在使用DDL的安装脚本之后进行更改,但是我想知道是否有可能对VARCHAR的下游依赖是255 char 有什么想法吗?我无法想象,不过,如果您减小varchar的大小,情况可能会有所不同 另见: 我无法想象,但是,
Mage\u Sales\u Model\u Resource\u设置中的\u addFlatAttribute()
方法将varchar的长度硬编码为255。它可以在使用DDL的安装脚本之后进行更改,但是我想知道是否有可能对VARCHAR的下游依赖是255 char
有什么想法吗?我无法想象,不过,如果您减小varchar的大小,情况可能会有所不同
另见:
我无法想象,但是,如果减小varchar的大小,情况可能会有所不同
另见:
我相信,考虑到实例中订单实体数据的规模不断扩大,您最好这样做。我很好奇Magento的哪个版本,因为CE1.6+是第一个拥有这个类的版本。在CE1.6之前,该课程为。这是一个重要的区别,因为这些类中的列定义方法不同,以适应1.6中的DB不可知方法+
:
以及:
我相信,考虑到一个实例中订单实体数据的规模不断扩大,您将很好地建议这样做。我很好奇Magento的哪个版本,因为CE1.6+是第一个拥有这个类的版本。在CE1.6之前,该课程为。这是一个重要的区别,因为这些类中的列定义方法不同,以适应1.6中的DB不可知方法+
:
以及:
使用类型TEXT而不是VARCHARMage\u Sales\u Model\u Resource\u Setup
在这种情况下假定长度为64KB。使用文本而不是VARCHARMage\u Sales\u Model\u Resource\u Setup
在本例中假定长度为64KB。谢谢Nathan,我同意MySQL端应该没问题,我更关心的是Magento端……前端的一些PHP页面的验证将某些输入限制为255个字符,但是,当您添加自己的属性时,您正在更改的内容不应该影响这些属性。不过,请确保您的PHP页面中也有适当的验证。谢谢Nathan,我同意MySQL端应该没问题,我更关心的是Magento端……前端的一些PHP页面的验证将某些输入限制为255个字符,但是,当您添加自己的属性时,您正在更改的内容不应该影响这些属性。不过,请确保您的PHP页面中也有相应的验证。感谢Ben,这是在1.12(EE)-模块依赖性问题的单独开发中:)我确实认为最好将字段限制为400个字符,而不是由于行限制(我想这就是您所指的)而允许65k的文本。啊,我被“varchar长度的硬编码”挂断了-正如你在上面看到的,它应该是文本。遗憾的是,在这种上下文中不能指定字段的长度(没有类重写),但是在添加后更新该列的解决方案应该是可行的。但是,请注意,如果采用这种方法,您将对表进行两次更改,这在任意大的表上可能是一个问题—通常是销售实体表的情况。双重更改的优点在于将表锁定一段时间。感谢Ben,这在1.12(EE)中-模块依赖性问题的单独开发:)我确实认为将字段限制为400字符是一个好主意,而不是因为行限制(我想这就是您所指的)而允许65k的文本。啊,我被“硬编码varchar的长度”挂断了-正如您在上面看到的,它应该是文本。遗憾的是,在这种上下文中不能指定字段的长度(没有类重写),但是在添加后更新该列的解决方案应该是可行的。但是,请注意,如果采用这种方法,您将更改表两次,这在任意大的表上可能是一个问题—通常是销售实体表的情况。双重更改的优点是—意味着将表锁定一段时间。
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;
}
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;
}