【问题标题】:mysql select distinct letters, including extended latin charactersmysql选择不同的字母,包括扩展的拉丁字符
【发布时间】:2014-08-19 09:54:29
【问题描述】:

原问题:

表结构:

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] 等),它们都不起作用。如何 解决这个问题?

编辑澄清:我想要的不仅仅是得到所有的字母 出来,但也可以按照我在预期中指定的顺序获取它们 结果。 utf8_bin 获取所有字母,但它们在 错误的方式 - 扩展拉丁字符仅在所有基本之后 拉丁字符(例如:a、b、c、ā、č)。另外,我的实际表 using 每个字母有很多文本,因此必须进行分组。

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

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

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

【问题讨论】:

  • 你试过utf8_bin吗?
  • @juergend - 添加了一个编辑来澄清一件事。
  • 很想知道结果是什么:SELECT letter FROM texts;
  • @ak0053792 - 如果所有文本都以唯一的字母开头,这对我有用,但在实际表格中,每个字母最多有一百个不同的文本,所以我需要将它们分组.

标签: mysql sql


【解决方案1】:

检查ManualBINARY 类型

SELECT DISTINCT BINARY `letter` FROM `texts` 

查看SQL Fiddle

【讨论】:

  • 效果很好,谢谢! phpMyAdmin 显示扩展的拉丁字母,如“c481”而不是“ā”,但在导出结果集时,它显示得很好。
  • 啊,一件事。我在letter 列上有索引,默认情况下它对字母进行正确排序,但是如果我在查询中添加ORDER BY letter ASC,排序就会出错,扩展的拉丁字符会再次出现在基本拉丁字符之后。这是为什么?这是我的意思的一个例子:pastebin.com/57an2pCX
  • 查看此链接sqlfiddle.com/#!2/4f5eb5/1 Order 子句没有任何问题
  • 是的,那个小提琴在'a'之前输出'ā',在'u'之前输出'ū'。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 2017-12-01
  • 2016-05-19
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2017-12-10
相关资源
最近更新 更多