mysql选择不同的字母,包括扩展的拉丁字符

时间:2014-06-28 11:11:54

标签: mysql sql

原始问题:

  

表格结构:

CREATE TABLE `texts` (
  `letter` VARCHAR(1) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `text` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  INDEX (`letter` ASC),
  INDEX (`text` ASC)
)
ENGINE InnoDB
CHARACTER SET utf8
COLLATE utf8_general_ci;
     

示例数据:

INSERT INTO `texts`
(`letter`, `text`)
VALUES
('a', 'Apple'),
('ā', 'Ābols'),
('b', 'Bull'),
('c', 'Cell'),
('č', 'Čakste');
     

我正在执行的查询:

SELECT DISTINCT `letter` FROM `texts`;
     

预期结果:

`letter`
a
ā
b
c
č
     

实际结果:

`letter`
a
b
c
     

我尝试了很多utf8排序规则(utf8_ [bin | general_ci | unicode_ci],   utf8mb4_ [bin | general_ci | unicode_ci]等),它们都不起作用。如何   解决这个问题?

     

编辑澄清:我想要的不只是获取所有字母   out,但也按照我在预期中指定的顺序获取它们   结果。 utf8_bin获取所有字母,但是它们是在   错误的方式 - 扩展拉丁字符只跟随所有基本   拉丁字符(例如:a,b,c,ā,č)。另外,实际的表我   使用每个字母有很多文本,所以分组是必须的。

编辑#2:这是来自实际网站的完整表格数据 - http://pastebin.com/cH2DUzf3 执行该SQL并在此之后运行以下查询:

SELECT DISTINCT BINARY `letter` FROM `texts` ORDER BY `letter` ASC

产生几乎完美的结果,但有一个例外:字母'ū'在'u'之前是,这至少可以说是奇怪的,因为所有其他扩展的拉丁语字母出现在他们的基本拉丁版本之后。我如何解决这最后一个问题?

1 个答案:

答案 0 :(得分:3)

检查Manual BINARY类型

SELECT DISTINCT BINARY `letter` FROM `texts` 

检查SQL Fiddle