Как выбрать уникальный список первых символов [MySQL] - PullRequest
1 голос
/ 14 апреля 2009

У меня есть столбец, содержащий список имен. Мне нужно выбрать только первые (уникальные) буквы из названия. Для символов, отличных от utf-8, следующий запрос работает очень хорошо:

SELECT DISTINCT LEFT(T1.Name, 1) AS firstLetter

Однако, когда имя начинается с символа в кодировке UTF-8, возвращается: -знак. Я предполагаю, что это только первый символ строки UTF-8.

Заранее спасибо.

Вопрос в том, как правильно выбрать полный первый символ из столбца выше.

P.S .: Для набора символов таблицы установлено значение utf8, а для параметров сортировки установлено значение utf8_bin, для набора символов полей установлено значение utf8, а для параметра сравнения - значение utf8_turkish_ci.

Ответы [ 3 ]

5 голосов
/ 14 апреля 2009

LEFT(str, 1) предполагается для самого левого символа , а не для самого левого байта . Это означает, что запрос выполняет то, что вы хотите, даже если первый символ является многобайтовым символом.

Я предполагаю, что знак emer появляется позже, из-за проблемы подключения / кодирования / шрифта / рендеринга. Попробуйте

SELECT LENGTH(LEFT(T1.Name, 1)) AS charLength

LENGTH возвращает, сколько байтов занимает строка, поэтому, если этот запрос дает результаты 2 или более, это означает, что LEFT() действительно возвращает многобайтовые символы, и ваша проблема выходит за рамки запроса сам по себе.

Если вы выполняете запрос в командной строке, возможно, ваш терминал не может отобразить символы, или в противном случае они искажаются где-то еще. Если вы используете язык сценариев, попробуйте использовать длину строки этого языка и функции ord(), чтобы выяснить, что происходит.

РЕДАКТИРОВАТЬ: Поскольку вы используете PHP, попробуйте это:

//Store a character returned from the database in $unicodechar
$unicodechar = $row[0];

//Now print out the value of each byte in the character
for($i = 0; $i < strlen($unicodechar); $i++)
{
    echo '0x' . dechex(ord($char[$i])) . ' ';
}
echo '\n';

Если, например, результат - , этот символ , тогда вы должны получить "0xC4 0x9E". Если вы действительно получаете такие вещи, то PHP правильно получает многобайтовые символы, и проблема заключается либо в кодировке самой веб-страницы (см. эта страница W3C ), либо в браузере / шрифте это невозможно сделать этот конкретный символ.

0 голосов
/ 14 апреля 2009

Функция ORD возвращает код для самого левого символа, как многобайтового, так и базового ASCII. Вы можете сделать что-то вроде:

SELECT DISTINCT ORD(T1.Name) AS firstCode

Чтобы вернуть символы, вы можете использовать функцию CHAR , указав набор символов UTF-8, чтобы получить что-то вроде:

SELECT DISTINCT CHAR(ORD(T1.NAME) USING utf8) as firstLetter
0 голосов
/ 14 апреля 2009

Согласно документации, функция подстроки является многобайтовой. Я попробовал с базой данных russion. Это должно сделать трюк:

SELECT DISTINCT SUBSTRING(T1.Name, 1, 1) AS firstLetter FROM T1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...