Я верю, что вы ищете что-то вроде этого:
SELECT *
FROM (
SELECT
reg.id,
reg.collection_id,
cr.number,
COUNT(*) AS ct
FROM tbl_registers AS reg
INNER JOIN tbl_cross AS cr
ON cr.register_id = reg.id
GROUP BY
reg.id,
reg.collection_id,
cr.number
) duplicates
WHERE duplicates.ct > 1
-- AND duplicates.collection_id = 56
Когда PHP был запущен несколько лет назад, UTF-8 действительно не поддерживался. Мы говорим о времени, когда не-Unicode, ОС как Windows 98 / Меня была все еще текущей и когда другие большие языки как Delphi были также не-Unicode. Не все языки были разработаны с Unicode в памяти со дня 1, и полностью изменение Вашего языка к Unicode, не повреждая много материала трудно. Delphi только стал Unicode, совместимым год или два назад, например, в то время как другие языки как Java или C# были разработаны в Unicode со Дня 1.
Поэтому, когда PHP вырос и стал PHP 3, PHP 4 и теперь PHP 5, просто никто не решил добавить Unicode. Почему? По-видимому, для хранения совместимым с существующими сценариями или потому что utf8_de/encode и mb_string уже существовали и работа. Я не знаю наверняка, но я сильно полагаю, что это имеет некоторое отношение к органическому росту. Функции просто не существуют по умолчанию, они должны быть записаны кем-то, и этого просто еще не произошло для PHP.
Редактирование: хорошо, я считал вопрос неправильно. Вопрос: Как строки хранятся внутренне? Если я ввожу в "WГ¤hrung" или "Г‰criture", какое Кодирование используется для создания используемых байтов? В случае PHP это - ASCII с Кодовой страницей. Это означает: Если я закодирую строку с помощью ISO-8859-15, и Вы декодируете его с некоторой китайской кодовой страницей, то Вы станете странными результаты. Альтернатива находится на языках как C# или Java, где все хранится как Unicode, что означает: больше нет никакой кодовой страницы, и теоретически Вы не можете испортить. Я рекомендую статья Joel о Unicode и Наборах символов, но по существу это сводится к: Как строки хранятся внутренне, и ответ с PHP "Не в Unicode", который означает, что необходимо быть очень осторожными и явными, чтобы обработка строк удостоверилась, что всегда сохранила строку в надлежащем кодировании во время входа, устройство хранения данных (база данных) и произвела, который очень подвержен ошибкам.
Понятие "многобайтового символа" в ядре проблемы.
Вы говорите это сами: для корректного контакта со строками, которые содержат многобайтовые символы, необходимо использовать расширение. Забудьте где угодно использовать дополнительные функции вместо более знакомых "нормальных", и Ваши данные искалечены. То же происходит, если Вы пользуетесь сторонней библиотекой, которая не была обновлена для использования дополнительной функции везде.
кроме того, много чрезвычайно популярная кодировка все еще явно не поддерживается PHP, по-видимому, потому что невозможно сделать так и остаться вниз совместимым.
Многие общие расширения не имеют поддержки unicode или (еще хуже), "необходимо знать", что строка содержит unicode/utf-8 последовательности, как, например, XMLReader. И это может иметь настоящее значение, называет ли шарик PHP () FindFirstFileA или FindFirstFileW на win32.
Другой (намного меньший, но удивительно часто бывший источником раздражения) проблемой являются BOM, которые не распознают PHP.
Многие строковые функции являются просто тонкими обертками вокруг эквивалентов библиотеки C, которые также рассматривают все как последовательность байтов. Другая причина состоит в том, что PHP несет вокруг большого количества бесполезного багажа прежней совместимости и таким образом застревает с плохими проектными решениями от 3& 4.
, Возможно, с 5.3's пространства имен у них наконец будет способ постепенно сократить старые функции.
То, что предназначено 'поддержкой', является 'собственной поддержкой'. Смотрите на это для получения подробной информации.