问题
MySQL 中有最大密钥长度限制。
这些以字节为单位! 因此,一个 UTF-8 字符可能需要超过一个字节才能存储到密钥中。
因此,您只有两个直接的解决方案:
- 仅索引文本类型的前 n 个字符。
- 创建
FULL TEXT
搜索——文本中的所有内容都将是可搜索的,其方式类似于 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
,如果您使用其他模式之一,它将进行部分词匹配。在此处查看有关全文选项的更多信息: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;