Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用字符集utf8mb4获得精确的筛选结果_Mysql_Indexing_Sql Like_Cultureinfo_Utf8mb4 - Fatal编程技术网

Mysql 使用字符集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

我想使用字符集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'”
时,为什么我得到的结果也有字母(如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
排序规则;该名称暗示“区分重音和大小写”,但排序规则还需要检查其他内容。