蝉知CMS的导航长度

一直用蝉知CMS做某个网站。由于放到导航里的内容太多,昨天该网站的导航菜单出现了故障。经过修改数据库里某个字段,解决了该问题。以下记录了我解决该问题的过程。

发现问题

导航里原本已有几百个菜单项。再添加几条链接到导航后,刷新前台,发现只出现了两个菜单项。根据直觉,我判断一定是数据库的某个列溢出了。所以我利用本地的测试网站进行了问题排除。

首先怀疑是eps_config表格的ID列,是mediumint(8),可以放256个项目。但eps_config表格不是直接存储导航内容的,而是包含了网站系统的所有配置。排除ID列的问题。

接着,我在导航里添加了一个新的链接,标题里填一个独一无二的单词,比如doge,便于定位。利用MySQL Workbench的查询功能,我发现该单词出现在eps_config表格中某一行的value列里。

可以看出,value列的数据类型是text,内容是json格式的字符串。查询得知,text类型最多存储64 kB的字符串。很显然,对特别大的配置项,如这种包含几百条链接的导航菜单,text类型就力不从心了。

解决问题

解决方法已经很明显了。MySQL的mediumtext类型能存储16 MB的字符串,足以保证我们将导航菜单的条目增加200多倍(不可思议)。

进入MySQL系统,运行如下命令:

ALTER TABLE eps_config MODIFY value MEDIUMTEXT NOT NULL;

经验证,此方法有效。

更多的话

MySQL Workbench能搜索整个数据库,非常方便。

除了上面说的textmediumtext类型,MySQL还有两种文本数据类型,其中tinytext最大存储256 Bytes,longtext最大存储4 GB。

由于蝉知CMS后台的导航编辑表单非常大,最好将php.ini配置文件的max_input_vars配置项调大一些。默认是1000,最好调到5000或更多。另外,post_max_size的值不能太小。