如何选择第一个字符的唯一列表[MySQL]

tur*_*zky 1 mysql utf-8

我有一个包含名称列表的列.我只需要从名称中选择第一个(唯一的)字母.对于非utf-8字符,以下查询非常有效:

SELECT DISTINCT LEFT(T1.Name, 1) AS firstLetter
Run Code Online (Sandbox Code Playgroud)

但是,当Name以UTF-8编码字符开头时,它返回: -sign.我想它只是UTF-8字符串的第一个字符.

提前致谢.

问题是如何从上面的列中正确选择完整的第一个字符.

PS:表字符集为utf8,排序规则设置为utf8_bin,字段字符集为utf8,排序规则设置为utf8_turkish_ci.

Art*_*ius 5

LEFT(str, 1)应该是最左边的字符,而不是最左边的字节.这意味着查询正在执行您想要的操作,即使第一个字符是多字节字符也是如此.

由于连接/编码/字体/渲染问题,我猜测 符号会在稍后出现.尝试

SELECT LENGTH(LEFT(T1.Name, 1)) AS charLength
Run Code Online (Sandbox Code Playgroud)

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';
Run Code Online (Sandbox Code Playgroud)

例如,如果结果是这个字符,那么你应该得到"0xC4 0x9E".如果你确实得到了这种东西,那么PHP正确地获得多字节字符,问题在于网页本身的编码(参见本W3C页面)或浏览器/字体无法呈现该特定字符.