【问题标题】:How do I select a unique list of first characters [MySQL]如何选择第一个字符的唯一列表 [MySQL]
【发布时间】:2010-10-19 07:13:40
【问题描述】:

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

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

但是,如果名称以 UTF-8 编码字符开头,则返回:�-sign。我想这只是 UTF-8 字符串的第一个字符。

提前致谢。

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

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

【问题讨论】:

    标签: mysql utf-8


    【解决方案1】:

    根据文档,子字符串函数是多字节安全的。我尝试使用俄罗斯数据库。这应该可以解决问题:

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

    【讨论】:

    • 你用什么发出选择?命令行客户端通常不能很好地处理多字节,因为它取决于底层终端。试试 MySQL Query Browser 或类似的东西。
    【解决方案2】:

    ORD 函数将返回最左边字符的代码,无论是多字节还是基本 ASCII。您可以执行以下操作:

    SELECT DISTINCT ORD(T1.Name) AS firstCode
    

    要取回字符,您可以使用 CHAR 函数指定 UTF-8 字符集来获取类似:

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

    【讨论】:

      【解决方案3】:

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

      我猜测 � 符号稍后会出现,原因是连接/编码/字体/渲染问题。试试

      SELECT LENGTH(LEFT(T1.Name, 1)) AS charLength
      

      LENGTH 返回一个字符串占用了多少 bytes,因此,如果此查询为您提供 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),要么浏览器/字体无法呈现该特定字符。

      【讨论】:

      • 对,这也是我怀疑的。请参阅我的答案中的评论。与此同时,我也尝试了 LEFT,它也支持多字节。
      • 确实,它返回 2 作为字符的长度。感谢您的提醒! //我正在使用PHP查看结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多