2009-04-14 93 views
1

我有一列包含名称列表。我只需要选择名称中的第一个(唯一)字母。 对于非UTF-8字符以下查询工作得很好:如何选择第一个字符的唯一列表[MySQL]

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

然而,当名字以UTF-8编码的字符,该返回开始: - 符号。我想这只是UTF-8字符串的第一个字符。

在此先感谢。

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

P.S .:表字符集是utf8,排序规则设置为utf8_bin,字段字符集是utf8,排序规则设置为utf8_turkish_ci。

回答

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)或浏览器/字体无法呈现特定的字符。

0

根据文档,子字符串函数是多字节安全的。我试着用russion数据库。这应该做的伎俩:

SELECT DISTINCT SUBSTRING(T1.Name, 1, 1) AS firstLetter FROM T1 
+0

不幸的是,它没有工作:( – turezky 2009-04-14 07:51:38

+0

你发出的选择与什么?命令行客户端通常对于多字节表现不佳,因为它取决于底层终端。尝试MySQL查询浏览器或类似的东西。 – 2009-04-14 07:55:09

0

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

SELECT DISTINCT ORD(T1.Name) AS firstCode 

为了让人物回来,然后你可以使用CHAR函数指定UTF-8字符集得到的东西,如:

SELECT DISTINCT CHAR(ORD(T1.NAME) USING utf8) as firstLetter 
相关问题