Mysql 使用字符集utf8mb4获得精确的筛选结果
我想使用字符集utf8mb4精确匹配筛选结果Mysql 使用字符集utf8mb4获得精确的筛选结果,mysql,indexing,sql-like,cultureinfo,utf8mb4,Mysql,Indexing,Sql Like,Cultureinfo,Utf8mb4,我想使用字符集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
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'”
时,为什么我得到的结果也有字母(如u-sasdasd或anfüs)
或
为什么当我过滤为“like'üs%”或“='anfüs'”
时,我得到的结果也有u字母(比如usasdasd或anfus)
当我过滤为“like's%”或“='anfüs'”
或”='anfüs'”
时,我如何获得只有ü字母的结果(如üsasdasd或anfüs)
ANSWER:
我不知道为什么,但是,COLLATE=utf8mb4\u 0900\u因为\u cs解决了这个问题。对于密码,您想忽略所有大小写折叠、重音去除等,所以使用COLLATE utf8mb4\u bin
我怀疑utf8mb4\u 0900\u as\u cs
与\u bin
不太一样
另一方面,您真的想存储“明文”密码吗?一种常见的技术是存储pwd的散列,并在测试时进行散列。一个简单的哈希,可以防止偶然的黑客攻击:
MD5(CONCAT(password, 'my secret salt'))
你不使用COLLATE=utf8mb4_0900_ai_ci的任何原因?不幸的是,这并不重要。是的,utf8mb4_bin也适用于我。但实际的区别是什么?是大小写折叠吗?所有\u bin
排序规则逐位比较。没有箱子折叠,什么也没有。我没有研究新的-with-8.0…\u as\u cs
排序规则;该名称暗示“区分重音和大小写”,但排序规则还需要检查其他内容。