MariaDB: where firstname = 'André': возвращает строки с firstname = André и firstname = Andre - PullRequest
0 голосов
/ 11 июля 2020

У меня проблема в том, что я возвращаю слишком много строк с помощью оператора select. Я ограничиваю часть where, но MariaDB игнорирует мое сравнение, если значения в столбце содержат специальные символы.

В следующем примере я вставил две строки в таблицу.

  1. row содержит " André »- последний символ этого имени -« é »(U + 00E9).
  2. строка содержит« Andre »- последний символ этого имени:« e . "(U + 0065).
CREATE TABLE `name_test` (`firstname` varchar(40) ) ENGINE=InnoDB AUTO_INCREMENT=48531 DEFAULT CHARSET=utf8mb4;

insert into name_test (firstname) values ('André');

insert into name_test (firstname) values ('Andre');

select * from name_test where firstname = 'André';

firstname
=========
André
Andre

select * from name_test where firstname = 'Andre';

firstname
=========
André
Andre

SHOW SESSION VARIABLES LIKE 'character_set%';

Variable_name                Value
==========================   =====
character_set_client         utf8
character_set_connection     utf8
character_set_database       utf8mb4
character_set_filesystem     binary
character_set_results        utf8
character_set_server         utf8mb4
character_set_system         utf8
character_sets_dir           /usr/share/mysql/charsets/



select 'Andrée' = 'Andree';

'Andrée' = 'Andree'
===================
1

SET collation_connection = utf8mb4_bin;

select 'Andrée' = 'Andree';

'Andrée' = 'Andree'
===================
0

select * from name_test where firstname = 'André';

firstname
=========
André
Andre

SHOW SESSION VARIABLES where variable_name like 'version%';


Variable_name                 Value
===========================   ================================
version                       10.0.38-MariaDB-0ubuntu0.16.04.1
version_comment               Ubuntu 16.04
version_compile_machine       x86_64
version_compile_os            debian-linux-gnu
version_malloc_library        bundled jemalloc

почему я получаю две строки, возвращаемые для операторов select, а не только одну?

Есть ли другой оператор сравнения, кроме" = "?

1 Ответ

1 голос
/ 11 июля 2020

Это зависит от набора символов / сопоставления, считаются ли символы с диакритическими знаками такими же, как символы без ударения.

Изменение значения collation_connection не помогает, поскольку ваш столбец имеет собственное сопоставление который имеет более высокий приоритет сопоставления.

Что вы можете сделать, так это изменить сопоставление столбца или использовать COLLATE:

select * from name_test where firstname collate utf8mb4_bin = 'André' ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...