使用字符集utf8mb4获取准确的过滤器结果

时间:2019-05-01 19:57:20

标签: mysql indexing sql-like cultureinfo utf8mb4

我想使用CHARACTER SET utf8mb4完全匹配过滤器结果。

ALTER DATABASE test CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

CREATE TABLE users (    
username VARCHAR(25) NOT NULL,    
password VARCHAR(25) NULL NULL
) 
ENGINE=innodb DEFAULT CHARSET=utf8mb4 
COLLATE=utf8mb4_general_ci ROW_FORMAT=DYNAMIC;
CREATE  INDEX  users_username_idx ON users (username); 

我插入了100万行,其中也包含下面的行。

INSERT INTO users SELECT 'üsasdasd','somepassword';
INSERT INTO users SELECT 'usasdasd','somepassword';
INSERT INTO users SELECT 'pğasdasdasd','somepassword';
INSERT INTO users SELECT 'anfüs','somepassword';
INSERT INTO users SELECT 'anfus','somepassword';

然后应用了一些查询。

SELECT * FROM users WHERE username LIKE 'üs%';
SELECT * FROM users WHERE username LIKE 'us%';
SELECT * FROM users WHERE username LIKE 'pğ%';
SELECT * FROM users WHERE username = 'anfüs';
SELECT * FROM users WHERE username = 'anfus';

当我过滤为"LIKE 'us%'"" = 'anfus'"时,为什么为什么我的结果也有ü字母(如üsasdasd或anfüs)
要么 当我过滤为"LIKE 'üs%'"" = 'anfüs'"时,为什么会得到还带有u字母的结果(例如usasdasd或anfus)?

当我过滤为"LIKE 'üs%'"" = 'anfüs'"时,如何获得仅带有ü字母(如üsasdasd或anfüs)的结果?

ANSWER:

我不知道为什么,但是,COLLATE = utf8mb4_0900_as_cs解决了该问题。

1 个答案:

答案 0 :(得分:1)

对于密码,您想忽略 all 大小写折叠,重音符号剥离等,因此请使用COLLATE utf8mb4_bin

我怀疑utf8mb4_0900_as_cs_bin不太相同。

另一方面,您是否真的要存储“明文”密码?一种常见的技术是存储pwd的哈希,并在测试时进行哈希。一个简单的哈希值,可以防止偶然的黑客入侵:

MD5(CONCAT(password, 'my secret salt'))