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

时间:2009-04-14 07:41:47

标签: mysql utf-8

我有一个包含名称列表的列。我只需要从名称中选择第一个(唯一的)字母。 对于非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。

3 个答案:

答案 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)

ORD函数将返回最左侧字符的代码,如果它是多字节或基本ASCII。你可以这样做:

SELECT DISTINCT ORD(T1.Name) AS firstCode

要恢复角色,您可以使用指定UTF-8字符集的CHAR函数来获得类似的内容:

SELECT DISTINCT CHAR(ORD(T1.NAME) USING utf8) as firstLetter