同时实现二进制和排序的属性

时间:2009-10-28 10:57:16

标签: sql mysql

我的数据库中有一个varchar字段,用于两个截然不同的事情。在一种情况下,我使用它来区分大小写,以确保不会插入重复项。为实现这一点,我将比较设置为二进制。但是,我希望能够在相同的列值上不区分大小写地搜索。有没有什么办法可以做到这一点,而不是简单地创建一个带有整理而不是二进制的冗余列?

2 个答案:

答案 0 :(得分:2)

CREATE TABLE t_search (value VARCHAR(50) NOT NULL COLLATE UTF8_BIN PRIMARY KEY);

INSERT
INTO    t_search
VALUES  ('test');

INSERT
INTO    t_search
VALUES  ('TEST');

SELECT  *
FROM    t_search
WHERE   value = 'test' COLLATE UTF8_GENERAL_CI;

第二个查询将返回两行。

但请注意,应用COLLATE的任何内容都具有最低的强制性。

这意味着value为了比较目的而转换为UTF8_GENERAL_CI,而不是反过来,这意味着value上的索引不会用于搜索并且查询中的条件不会是可以理解的。

如果您在不区分大小写的搜索方面需要良好的性能,则应创建一个不区分大小写的排序规则的附加列,将其编入索引并在搜索中使用。

答案 1 :(得分:0)

您可以使用COLLATE语句更改查询中列的排序规则。有关广泛的示例,请参阅this manual page