Я получаю двойные результаты из запроса mysql при использовании международных символов, то есть Å / Ä = A & Ö = O, - PullRequest
3 голосов
/ 26 октября 2010

Например, если я ищу имя sa, я хочу получить только имя sa, а не Asa, то же самое с Бьёрном вместо Bjorn

$query="select * from users where username like 'Björn'";
$result=mysql_query($query);
$num=mysql_num_rows($result);
echo"$num";
$i=0;
while($i<$num){     
$id=mysql_result($result,$i,"id");
$name=mysql_result($result,$i,"username");    
echo"<br/>$id,$name";
$i++;
}

Результаты

34,Björn
67,Bjorn

толькодолжен отображаться результат 34
Я использую

mysql_query("SET NAMES utf8");
mysql_query( "SET CHARACTER SET utf8");

База данных, таблица и столбец установлены в utf8_unicode_ci

Ответы [ 3 ]

6 голосов
/ 26 октября 2010

Ваша "проблема" - сопоставление utf8_unicode_ci. Это сопоставление выполняет «расширение символов», то есть умлауты и их базовые символы рассматриваются как одинаковые даже при сравнении = :

A = Ä
O = Ö
...

Второй пример на этой странице руководства mySQL объясняет проблему: 9.1.7.8. Примеры эффекта сопоставления

То, что вам нужно сделать, это либо переключиться на сопоставление, которое различает умлаут и базовый символ (например, utf8_general_ci или utf8_general_bin), либо переключиться на другое сопоставление только при выполнении сравнения:

select * from users where username like 'Björn' COLLATE utf8_general_ci;

это, очевидно, медленнее, потому что преобразование параметров сортировки должно выполняться для каждой записи во время запроса.

1 голос
/ 26 октября 2010

База данных, таблица и столбец установлены в utf8_unicode_ci

Это сопоставление преднамеренно заставляет многие акцентированные символы соответствовать их безударным базам.Часто это то, что вы хотите, иногда это не так.Когда это не так, вы должны выбрать сопоставление, которое наилучшим образом соответствует правилам языка, с которым вы работаете. Вот несколько таблиц сопоставлений MySQL, которые вы можете искать, чтобы найти что-то подходящее.

utf8_swedish_ci - это часто используемая возможность, которая не сопоставляет A / Å / Ä и O /... вместе, хотя другие акцентированные символы все еще сопоставляются.К сожалению, я не вижу хорошего сопоставления, которое знает о широком диапазоне букв с европейским акцентом, но все равно относится к ним как к разным.Если вам вообще не нужно сопоставление без учета регистра, вы, конечно, можете использовать utf8_bin.

0 голосов
/ 26 октября 2010

Не используйте LIKE запрос, когда вы имеете в виду =.

$query="select * from users where username = 'Björn'";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...