Al intentar crear atributos, descubrí que la longitud máxima de un código de atributo es de 30 caracteres. Sin embargo, resulta que esto NO es en realidad una especie de restricción real: es un valor completamente arbitrario, definido por
Mage_Eav_Model_Entity_Attribute::ATTRIBUTE_CODE_MAX_LENGTH.
Entonces, dado que, ¿por qué hay alguna restricción? ¿Y por qué el valor predeterminado es 30, en lugar de 255, que es el límite real de la columna de la base de datos?
PD. Si alguien puede pensar en mejores etiquetas para esta pregunta, actualícelas.
fuente
ATTRIBUTE_CODE_MAX_LENGTH
constante no existía.Un ejemplo perfecto de equipos o desarrolladores individuales que no hablan entre sí. Si bien la
eav_attribute
tabla principalatrtibute_code
es avarchar(255)
, este valor de código a menudo se usa en otras tablas.En
catalog_product_link_attribute
hay unproduct_link_attribute_code
atributo (que es el código de atributo), y esta columna es unvarchar(32)
. En tiempos prehistóricos, cuando los objetos de ventas eran objetos EAV, tenían una columna de atributo_código que teníavarchar(50)
como longitud.Me imagino que hay otros también.
Sin una especificación o acuerdo real sobre lo que se estaba construyendo, el desarrollador a cargo de la interfaz de usuario para la sección de atributos probablemente miró todas las
attribute_code
columnas, eligió la más corta e impuso una longitud para asegurarse de que los usuarios no pudieran crear un código de atributo eso sería demasiado largo para una de las diversas tablas en las que otros desarrolladores estaban trabajando.En cuanto a por qué un desarrollador elegiría una
varchar
longitud que no fuera así255
: hay una escuela de pensamiento sobre el diseño de la base de datos que dice que solo hace sus columnas siempre que sea necesario para ahorrar espacio en disco, reducir RAM, ser más eficientes en las operaciones de unión , etc. Algunos desarrolladores aún se aferran a esto frente a la tendencia moderna de "hacerlo lo más grande posible y preocuparse por las implicaciones de rendimiento más adelante". Está claro que hubo un desacuerdo sobre la longitud máxima de unvarchar
forattribute_code
entre el equipo central de Magento en un punto, y ahora sigue vivo en el código heredado.fuente
Como dice xyphoid , la limitación anterior fue causada cuando se admitió Oracle BD porque en Oracle, las columnas solo pueden tener 30 caracteres de longitud.
Ahora,
Después de la modificación del núcleo de Okorshenko ( PR # 10225 )
El valor se define como 60 porque en el modo plano el código de atributo se transformará en el nombre de la columna. MySQL solo permite 64 símbolos en el nombre de la columna.
fuente
Para resolver este error, use este código
CONST ATTRIBUTE_CODE_MAX_LENGTH = 30; a 60
El código debe ser
CONST ATTRIBUTE_CODE_MAX_LENGTH = 60;
Esto resolverá tu problema.
fuente