我想使用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解决了该问题。
答案 0 :(得分:1)
对于密码,您想忽略 all 大小写折叠,重音符号剥离等,因此请使用COLLATE utf8mb4_bin
。
我怀疑utf8mb4_0900_as_cs
与_bin
不太相同。
另一方面,您是否真的要存储“明文”密码?一种常见的技术是存储pwd的哈希,并在测试时进行哈希。一个简单的哈希值,可以防止偶然的黑客入侵:
MD5(CONCAT(password, 'my secret salt'))