我想使用字符集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);

我插入了一百万行,其中也包含下面的行。
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'"时,为什么我得到的结果也有uLetter(比如uSasdasd或anfüs)
或者
当我过滤为"LIKE 'üs%'"" = 'anfüs'"时,为什么我得到的结果也有u字母(如usasdad或anfus)?
当我过滤为"LIKE 'üs%'"" = 'anfüs'"时,如何才能得到只有uLetter(如uSasdasd或anfüs)的结果,反之亦然?
ANSWER:

我不知道为什么,但是,COLLATE=utf8mb4_0900_cs解决了这个问题。

最佳答案

对于密码,您希望忽略所有大小写折叠、重音剥离等,因此使用COLLATE utf8mb4_bin
我怀疑utf8mb4_0900_as_cs_bin不太一样。
另一方面,你真的想储存“明文”密码吗?一种常见的技术是存储pwd的散列并在测试时执行散列。一个简单的散列,可以防止偶然的黑客:

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

关于mysql - 使用字符集utf8mb4获取准确的过滤器结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55941961/

10-08 22:21