关于使用 PHP7.1、Silverstripe 3.6.0 和 MySQL 的 Web 应用程序的问题。该应用程序托管在 PaaS 提供商上。因此,我无法直接访问数据库,也无法调整 InnoDB,就像错误消息所建议的那样。
我有一个包含很多字段的自定义DataObject。它在尝试保存时返回一个奇怪的错误:
Couldn't run query: [...big update query here...] Row size too large (> 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help. In current row format, BLOB prefix of 768 bytes is stored inline.
在这里您可以找到我的类(class)的简短版本:
class APIPersonResource extends DataObject {
private static $db = array(
'ResourceID' => 'Int',
'Firstname' => 'Varchar(255)',
'Lastname' => 'Varchar(255)',
'Salutation' => 'Varchar(255)',
'Email' => 'Varchar(255)',
'HomepageLink' => 'Text',
'PhoneNo' => 'Varchar(255)',
'Info' => 'HTMLText',
'IsResponsible' => 'Boolean',
'ResponsibleDescription' => 'Varchar(255)',
'ShortBio' => 'HTMLText',
'RoomNo' => 'Varchar',
'IsActive' => 'Boolean',
'IsAcademic' => 'Boolean',
'HasImage' => 'Boolean',
'HasLinksSection' => 'Boolean',
'HasCv' => 'Boolean',
'HasPublications' => 'Boolean',
'HasOfficeHours' => 'Boolean',
'AreaOfFocus' => 'Varchar(64)',
'OleLink' => 'Text',
'ReserveCollectionLink' => 'Text',
'ResearchAreas' => 'HTMLText',
'APIDepartmentResourceID' => 'Int',
'APIAddressResourceID' => 'Int',
'APIDegreeResourceID' => 'Int'
);
}
ShortBio
、AreaOfFocus
、ResearchAreas
和 Info
都是可能变得很长的用户输入字段。奇怪的是,这些字段的类型为 HTMLText
,而在数据库表中,列的类型为 mediumtext
:
MariaDB [leonixyz]> describe APIPersonResource;
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
| ID | int(11) | NO | PRI | NULL | auto_increment |
| ClassName | enum('APIPersonResource','APIPhdStudentResource') | YES | MUL | APIPersonResource | |
| LastEdited | datetime | YES | | NULL | |
| Created | datetime | YES | | NULL | |
| Salutation_en_US | varchar(255) | YES | | NULL | |
| Salutation_de_DE | varchar(255) | YES | | NULL | |
| Salutation_it_IT | varchar(255) | YES | | NULL | |
| ResponsibleDescription_en_US | varchar(255) | YES | | NULL | |
| ResponsibleDescription_de_DE | varchar(255) | YES | | NULL | |
| ResponsibleDescription_it_IT | varchar(255) | YES | | NULL | |
| ShortBio_en_US | mediumtext | YES | | NULL | |
| ShortBio_de_DE | mediumtext | YES | | NULL | |
| ShortBio_it_IT | mediumtext | YES | | NULL | |
| ResourceID | int(11) | NO | | 0 | |
| Firstname | varchar(255) | YES | | NULL | |
| Lastname | varchar(255) | YES | | NULL | |
| Salutation | varchar(255) | YES | | NULL | |
| Email | varchar(255) | YES | | NULL | |
| PhoneNo | varchar(255) | YES | | NULL | |
| IsResponsible | tinyint(1) unsigned | NO | | 0 | |
| ResponsibleDescription | varchar(255) | YES | | NULL | |
| ShortBio | mediumtext | YES | | NULL | |
| IsActive | tinyint(1) unsigned | NO | | 0 | |
| HasActiveContract | tinyint(1) unsigned | NO | | 0 | |
| APIDepartmentResourceID | int(11) | NO | | 0 | |
| RoomNo | varchar(50) | YES | | NULL | |
| HasImage | tinyint(1) unsigned | NO | | 0 | |
| HasCv | tinyint(1) unsigned | NO | | 0 | |
| HasPublications | tinyint(1) unsigned | NO | | 0 | |
| APIAddressResourceID | int(11) | NO | | 0 | |
| AreaOfFocus_en_US | varchar(64) | YES | | NULL | |
| AreaOfFocus_de_DE | varchar(64) | YES | | NULL | |
| AreaOfFocus_it_IT | varchar(64) | YES | | NULL | |
| AreaOfFocus | varchar(64) | YES | | NULL | |
| HomepageLink | mediumtext | YES | | NULL | |
| Info_en_US | mediumtext | YES | | NULL | |
| Info_de_DE | mediumtext | YES | | NULL | |
| Info_it_IT | mediumtext | YES | | NULL | |
| ResearchAreas_en_US | mediumtext | YES | | NULL | |
| ResearchAreas_de_DE | mediumtext | YES | | NULL | |
| ResearchAreas_it_IT | mediumtext | YES | | NULL | |
| Info | mediumtext | YES | | NULL | |
| HasLinksSection | tinyint(1) unsigned | NO | | 0 | |
| HasOfficeHours | tinyint(1) unsigned | NO | | 0 | |
| OleLink | mediumtext | YES | | NULL | |
| ReserveCollectionLink | mediumtext | YES | | NULL | |
| ResearchAreas | mediumtext | YES | | NULL | |
| APIDegreeResourceID | int(11) | NO | | 0 | |
| IsAcademic | tinyint(1) unsigned | NO | | 0 | |
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+
有没有办法解决这个问题而不将我的对象分成几部分?
提前致谢
最佳答案
您应该重构模型(例如,使用 has_one
和 belongs_to
的 1:1 关系),或者将 RowFormat 设置为压缩。这可以使用以下代码针对每个 DataObject 完成(来自 SS3,但也应该适用于 SS4):
private static $create_table_options = array(
'MySQLDatabase' => 'ENGINE=InnoDB ROW_FORMAT=COMPRESSED'
);
关于php - Silverstripe DataObject 太大,无法使用 MySQL/InnoDB 保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54111306/