我可以在MySQL中混合字符集和排序规则吗?

时间:2014-03-11 14:32:16

标签: mysql sql database

在MySQL中是否可以使用以下设置的字段:

CHARACTER SET utf8mb4
COLLATE latin1_general_ci

我希望字段中的搜索不区分大小写,但我不希望搜索a匹配á。

例如:
SELECT * FROM table WHERE field ='abc';

应该找到:ABC
应该找到:abC
不应该找:ábc
不应该找:ÀBC

有可能做我想做的事吗?

1 个答案:

答案 0 :(得分:0)

要在mysql中执行此操作:

SELECT * 从表 WHERE UPPER(field)= UPPER('string');

示例:

mysql> select * from item;

+---------+------------+
| id_item | state_item |
+---------+------------+
|       1 | complete   |
|       2 | removed    |
|       3 | REMOVED    |
|       4 | REmoveD    |
+---------+------------+
4 rows in set (0.01 sec)

mysql> SELECT *  FROM item  WHERE UPPER( state_item ) = UPPER( 'removed' );
+---------+------------+
| id_item | state_item |
+---------+------------+
|       2 | removed    |
|       3 | REMOVED    |
|       4 | REmoveD    |
+---------+------------+
3 rows in set (0.01 sec)

mysql> SELECT *  FROM item  WHERE UPPER( state_item ) = UPPER( 'REMOVED' );
+---------+------------+
| id_item | state_item |
+---------+------------+
|       2 | removed    |
|       3 | REMOVED    |
|       4 | REmoveD    |
+---------+------------+
3 rows in set (0.00 sec)

mysql>

这是你需要的吗?


如果您要使用另一个rdbms - CHECK约束将是一个选择,但在MySQL中它们不起作用。
这是一个工作量,您可以使用 BEFORE INSERT BEFORE UPDATE 触发器来创建自己的bussines逻辑流程,这会导致错误或设置字段不满足数据要求时的默认值  请参阅此类触发器的示例:

DELIMITER $$
CREATE TRIGGER bi BEFORE INSERT ON Tbl
FOR EACH ROW
BEGIN
    IF(NEW.col1 != REGEXP '^[A-Z]+$') THEN
SET {you insert,updets etc here }
    SIGNAL SQLSTATE '1'
        SET MESSAGE_TEXT := 'check constraint on Tbl.col1 failed';'
    END IF;
END$$   
DELIMITER ;