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 ), либо в браузере / шрифте это невозможно сделать этот конкретный символ.