问题
MySQL中存在最大键长度限制。
这些长度是以字节为单位计算的!因此,一个UTF-8字符可能需要多个字节才能存储到键中。
因此,您只有两个直接的解决方案:
将文本类型的前n个字符索引化。
创建一个“全文搜索”——在文本中,所有内容都可以被搜索,类似于ElasticSearch。
索引化文本类型的前N个字符
如果您正在创建一个表,请使用以下语法来索引某个字段的前255个字符:KEY
sometextkey (
SomeText(255))
。像这样:
CREATE TABLE `MyTable` (
`id` int(11) NOT NULL auto_increment,
`SomeText` TEXT NOT NULL,
PRIMARY KEY (`id`),
KEY `sometextkey` (`SomeText`(255))
);
如果您已经有了该表,则可以使用以下方法向字段添加唯一键:
ADD UNIQUE(ConfigValue(20));
。如下所示:
ALTER TABLE
MyTable
ADD UNIQUE(`ConfigValue`(20));
如果字段的名称不是
MySQL 关键字,则不需要在字段名周围使用反引号 (```)。
创建全文搜索
全文搜索将允许您搜索 TEXT
字段值的全部内容。如果使用 NATURAL LANGUAGE MODE
,它将进行整个单词匹配;如果使用其他模式,则进行部分单词匹配。有关 FullText 选项的更多信息,请参见:Dev.MySQL.com
创建带有文本的表,并添加全文索引...
ALTER TABLE
MyTable
ADD FULLTEXT INDEX
`SomeTextKey` (`SomeTextField` DESC);
然后像这样搜索您的表格...
SELECT
MyTable.id, MyTable.Title,
MATCH
(MyTable.Text)
AGAINST
('foobar' IN NATURAL LANGUAGE MODE) AS score
FROM
MyTable
HAVING
score > 0
ORDER BY
score DESC;