【问题标题】:Get exact filter results with charset utf8mb4使用 charset utf8mb4 获得准确的过滤结果
【发布时间】:2019-09-20 08:33:29
【问题描述】:

我想使用 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'" 时,为什么我得到的结果也有你的字母(如usasdasd 或anfus)?

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

ANSWER:

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

【问题讨论】:

  • 您不使用 COLLATE=utf8mb4_0900_ai_ci 的任何原因?
  • 不幸的是,这并不重要。

标签: mysql indexing sql-like cultureinfo utf8mb4


【解决方案1】:

对于密码,您希望忽略所有大小写折叠、重音去除等,因此请使用COLLATE utf8mb4_bin

我怀疑utf8mb4_0900_as_cs_bin 不太一样。

另一方面,您真的要存储“明文”密码吗?一种常见的技术是存储 pwd 的散列并在测试时进行散列。一个不受普通黑客攻击的简单哈希:

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

【讨论】:

  • 是的 utf8mb4_bin 也为我工作。但实际的区别是什么?是折叠的吗?
  • 所有_bin排序规则逐位比较。没有箱子折叠,什么都没有。我还没有研究过 new-with-8.0 ..._as_cs 排序规则;该名称暗示“区分重音和区分大小写”,但排序规则还会检查其他内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
相关资源
最近更新 更多