Получить точные результаты фильтрации с charset utf8mb4 - PullRequest
1 голос
/ 01 мая 2019

Я хочу точно сопоставить результаты фильтра, используя 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); 

Я вставил 1 миллион строк, также содержащих строки ниже.

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';

Почему я получаю результаты, которые ТАКЖЕ имеют букву ü (например, üsasdasd или anfüs), когда я фильтрую как "LIKE 'us%'" или " = 'anfus'"
ИЛИ Почему я получаю результаты, которые также имеют букву u (например,usasdasd или anfus), когда я фильтрую как "LIKE 'üs%'" или " = 'anfüs'"?

Как получить результаты, содержащие ТОЛЬКО букву ü (например, üsasdasd или anfüs), когда я фильтрую как "LIKE 'üs%'" или " = 'anfüs'" Viceнаоборот?

ANSWER:

Я не знаю почему, но COLLATE = utf8mb4_0900_as_cs устранил проблему.

1 Ответ

1 голос
/ 02 мая 2019

Для паролей вы хотите игнорировать все сворачивание, разбор акцентов и т. Д., Поэтому используйте COLLATE utf8mb4_bin.

Я подозреваю, что utf8mb4_0900_as_cs не совсем то же самое, что _bin.

С другой стороны, вы действительно хотите хранить «незашифрованные» пароли?Обычная техника - хранить хэш pwd и делать хэш при тестировании.Простой хеш, защищенный от случайных хакеров:

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