【发布时间】:2010-08-08 19:12:14
【问题描述】:
CREATE TABLE profile_category (
id mediumint UNSIGNED NOT NULL AUTO_INCREMENT,
pc_name char(255) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY idx_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
这是数据库中完全采用 utf8 字符集的表之一。问题就在这里(直到现在我才知道)pc_name 列的索引将增加三倍,因为 MySQL 为每个字符保留 3 个字节。在这种情况下,索引将占用更多空间。
我不能制作更短的索引,因为我需要这个值是唯一的。其中一种解决方案可以设置为pc_name char(255) CHARSET latin1 NOT NULL,,但我不知道这是否有问题。
这是一个好主意,还是有什么我不知道的解决方案?
更新:pc_name 列在应用程序中被验证为有效的 utf8。它允许非西方字符。但在这种情况下,我可以做一个交易,如果值得的话,只允许/[_A-Za-z]/。
更新 2:我尝试将 pc_name 设置为 latin1 字符集,但现在出现以下异常:Zend_Db_Statement_Exception: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
【问题讨论】:
-
索引通常用于加速查询而不是节省磁盘空间。
-
"所需的额外索引会显着增加表的总大小——即使列本身很小,尤其是在主键很大的情况下——并且除了外键检查之外对其他任何事情都无用。 "