2

我成功地将 Access DB 迁移到 MySQL DB。一切似乎都很好,但我需要 MySQL DB 的更具体的行为。选择选项"sort A to Z"
后,我需要与 Access DB 中完全相同的查询结果排序。 我在 Java 应用程序中使用这个结果。

MySQL 表是 UTF-8 并且排序规则设置为 utf8_general_ci。
示例查询是:

"SELECT encode, language FROM suffixes ORDER BY encode COLLATE utf8_unicode_ci"

它返回相似的结果,但排序存在不可接受的差异。

访问排序结果如下:

001_01._02.1_02.2.1_02.4_05.e.3.1_07.2.2_15.5.d_20.3.2.1_31.2.2_33.3.4_001
001_01._02.1_02.4.1_06.4.1_06.4.2_07.2.1.1_07.2.2_10.1_11.1.3_20.3.2.1_20.3.7_20.6.8_001

Java 对结果进行如下排序:

001_01._02.1_02.2.1_02.4_05.e.3.1_07.2.2_15.5.d_20.3.2.1_31.2.2_33.3.4_001                                                              
001_01._02.1_02.4_06.1_06.2.4.1.2_06.2.4.1.3_06.3.1_07.2.1.1_07.2.2.1_11.2.2_15.2.1.a.1_15.5.a_20.3.2.2.1.a_20.7.1.5_20.8_33.4.5.3_001 

另外我不知道如何在 Access 中检查字符集和排序规则。

谁能给我一个提示我应该怎么做才能获得正确的结果?

4

1 回答 1

0

我想通了。我使用 Collat​​or 类进行正确排序。

仅供参考,它看起来像这样(这是对 ArrayList 的排序):

public class AccessSorter
{ 
final static String letters = "< a, A < b, B < c, C < d, D < e, E < f, F < g, G < h, H < i, I < j, J < k, K < l, L < m, M < n, N < o, O < p, P < q, Q < r, R < s, S < t, T < u, U < v, V < w, W < x, X < y, Y < z, Z";
final static String digits = "< 0 < 1 < 2 < 3 < 4 < 5 < 6 < 7 < 8 < 9";
final static String special = "< '.' < '_'";
private RuleBasedCollator accessCollator;


AccessSorter()
{
    try
    {
        accessCollator = new RuleBasedCollator(special + digits + letters);
    }
    catch (ParseException e)
    {
        e.printStackTrace();
    }
}


SomeComparator getSomeComparator()
{
    return new SomeComparator();
}

class SomeComparator implements Comparator<String[]>
{
    @Override
    public int compare(String[] s1, String[] s2)
    {
       return accessCollator.compare(s1[1], s2[1]);
    }
}

}

用法示例:

Collections.sort(someCollectionOfStringArray, new AccessSorter().getSomeComparator()

现在您无需担心访问或 mySQL 的排序规则。你自己制定规则。当然,对这样的数组进行排序需要一些时间。
请记住,如果您需要对大数组进行多次排序,请考虑使用 getCollat​​orKey() 来提高效率。
还要记住,如果您需要在整理器中添加分号、句号、引号,请将它们放入 ' '。
我希望它能以某种方式帮助你。问候。

于 2013-09-02T09:51:41.933 回答