2009-08-15 220 views
2

我正在尝试将空间索引添加到名为Location类型为BLOB的表列。如果我试试这个:在MySql BLOB列上创建空间索引时出错

ALTER TABLE route ADD SPATIAL INDEX(Location); 

我得到:

Error: BLOB/TEXT column 'Location' used in key specification without a key length

但在official docs for MySql 5.1(我使用的版本),它指的是空间索引时,明确表示:

"In MySQL 5.1, column prefix lengths are prohibited. The full width of each column is indexed."

这肯定说我不需要提供前缀。我试着反正添加前缀是这样的:

ALTER TABLE route ADD SPATIAL INDEX(Location(256)); 

我也得到:

Error: Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys

那么究竟发生了什么事?对于信息,我使用的是MySQL 5.1.37社区,我的表是MyISAM的,这是create语句:

CREATE TABLE `climb`.`route` ( 
`Id` int(11) NOT NULL, 
`Name` varchar(255) NOT NULL, 
`Location` blob, 
PRIMARY KEY (`Id`), 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

PS我也试图使位置NOT NULL,这没有什么区别。

回答

1

应该在GEOMETRY类型上创建空间索引。

CREATE TABLE `route` (
     `Id` int(11) NOT NULL, 
     `Name` varchar(255) NOT NULL, 
     `Location` GEOMETRY NOT NULL, 
     PRIMARY KEY (`Id`), 
     SPATIAL KEY (`Location`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 
+0

正确,尽管MySql支持以已知二进制(WKB)格式使用几何列(http://dev.mysql.com/doc/refman/5.1/en/gis-wkb-format.html)的BLOB,看起来你不能有一个空间索引,诀窍是让流利的NHibernate来做到这一点,我不得不强制使用.CustomSqlTypeIs(“GEOMETRY”)的SQL类型。 – 2009-08-17 20:33:12

0

我相信您尝试添加空间索引的列应该声明为非空。

+0

感谢您的想法,但unfortunatley这已经没有什么区别:(我做了定位NOT NULL(更新了我的职务,以显示这一点),并且仍然得到同样的错误,当我尝试应用空间索引。 – 2009-08-17 12:14:02