首页 > 解决方案 > Silverstripe 数据对象太大,无法使用 MySQL/InnoDB 保存

问题描述

关于使用 PHP7.1、Silverstripe 3.6.0 和 MySQL 的 Web 应用程序的问题。该应用程序托管在 PaaS 提供商上。因此,我没有直接访问数据库的权限,也无法调整 InnoDB,就像错误消息所暗示的那样。

我有一个包含很多字段的自定义DataObject 。它在尝试保存时返回一个奇怪的错误:

无法运行查询:[...此处大更新查询...]行大小太大 (> 8126)。将某些列更改为 TEXT 或 BLOB 或使用 ROW_FORMAT=DYNAMIC 或 ROW_FORMAT=COMPRESSED 可能会有所帮助。在当前行格式中,768 字节的 BLOB 前缀被内联存储。

在这里,您可以找到我的课程的简短版本:

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,ResearchAreasInfo都是可以变得很长的用户输入字段。奇怪的是,这些字段是类型的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                 |                |
+------------------------------+---------------------------------------------------+------+-----+-------------------+----------------+

有没有办法在不将我的对象分成几部分的情况下解决这个问题?

提前致谢

标签: phpmysqlsilverstripe

解决方案


您应该重构您的模型(例如,使用 1:1 关系has_onebelongs_to),或者将 RowFormat 设置为压缩。这可以使用此代码为每个 DataObject 完成(来自 SS3,但也应该在 SS4 上工作):

private static $create_table_options = array(
    'MySQLDatabase' => 'ENGINE=InnoDB ROW_FORMAT=COMPRESSED'
);

推荐阅读