代码之家  ›  专栏  ›  技术社区  ›  turezky

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

  •  1
  • turezky  · 技术社区  · 15 年前

    我有一列,列上有名字。我只需要从名字中选择第一个(唯一的)字母。 对于非UTF-8字符,以下查询工作得很好:

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

    但是,当名称以utf-8编码字符开头时,返回:_?/1/2-符号。我想它只是utf-8字符串的第一个字符。

    事先谢谢。

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

    备注:表字符集为utf8,排序规则集为utf8_bin,字段字符集为utf8,排序规则集为utf8_turkish_ci。

    3 回复  |  直到 15 年前
        1
  •  5
  •   Artelius    15 年前

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

    我猜“1/2”符号稍后会出现,因为存在连接/编码/字体/呈现问题。尝试

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

        2
  •  0
  •   Daniel Schneller    15 年前

    根据文档,子串函数是多字节安全的。我用了一个Russion数据库。这应该可以做到:

    SELECT DISTINCT SUBSTRING(T1.Name, 1, 1) AS firstLetter FROM T1
    
        3
  •  0
  •   Il-Bhima    15 年前

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

    SELECT DISTINCT ORD(T1.Name) AS firstCode
    

    若要取回字符,可以使用 CHAR 函数指定utf-8字符集,以获取如下内容:

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