我有一个包含名称列表的列。我只需要从名称中选择第一个(唯一的)字母。 对于非utf-8字符,以下查询非常有效:
SELECT DISTINCT LEFT(T1.Name, 1) AS firstLetter
但是,当Name以UTF-8编码字符开头时,返回: -sign。我想它只是UTF-8字符串的第一个字符。
提前致谢。
问题是如何从上面的列中正确选择完整的第一个字符。
P.S。:表格字符集为utf8,排序规则设置为utf8_bin,字段字符集为utf8,排序规则设置为utf8_turkish_ci。
答案 0 :(得分:5)
LEFT(str, 1)
应该是最左边的字符,而不是最左边的字节。这意味着查询正在执行您想要的操作,即使第一个字符是多字节字符也是如此。
由于连接/编码/字体/渲染问题,我猜测 符号会在稍后出现。尝试
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';
如果结果是this character,那么你应该得到“0xC4 0x9E”。如果你确实得到了这种东西,那么PHP正确地获得多字节字符,问题在于网页本身的编码(参见this W3C page)或浏览器/字体无法呈现该特定字符
答案 1 :(得分:0)
根据文档,子字符串函数是多字节安全的。我尝试了一个russion数据库。这应该可以解决问题:
SELECT DISTINCT SUBSTRING(T1.Name, 1, 1) AS firstLetter FROM T1
答案 2 :(得分:0)