Java中的UCanAccess在带有特殊字符的列中使用ORDER BY子句返回错误的顺序

如何解决Java中的UCanAccess在带有特殊字符的列中使用ORDER BY子句返回错误的顺序

使用带有.mdb文件的Microsoft Access数据库(2007-2013),我创建了一个仅包含一个文本列test_table的简单"name"表,并插入了以下测试值:

óbito,fanatico,orbita,fanático,fanta,órbita,fantástico,obito,obituario,orbitando

当我使用MS Access查询设计执行查询SELECT * FROM test_table ORDER BY name时,返回以下有序结果:

fanatico,óbito,orbitando

这是完全正确的订单。

现在,我需要在Java软件中检索和使用这些值。为此,我使用版本5.0.0上的UCanAccess JDBC driver连接到数据库。连接本身已成功打开,但是,当我执行上述 same 查询时,它将返回以下内容:

fanatico
fanta
fantástico
fanático
obito
obituario
orbita
orbitando
óbito
órbita  

这不是正确的顺序(例如óbito应该紧跟obito之后)。所需顺序应将重音词视为与等效的未重音词相同。
óbitoobito之前还是之后都没关系,但它们必须在一起
我尝试使用COLLATE,尝试更改字符集等,但是没有任何效果。有没有人经历过类似的事情,您能帮我解决这个问题吗?预先感谢。

解决方法

驱动程序正在按其二进制表示形式和/或单个ASCII字符进行排序。两者都提供您在底部提供的排序顺序。这完全是由驱动程序造成的问题,并且“修复”将受到限制。

在JDBC驱动程序更改日志中,在2.0.9.3发行说明下发布了一种解决方法:WORKAROUND suggested: if you want the same behaviour of Access: select * from table2 order by orderJet( COLUMN1).

如果这不起作用,那么您要么需要 a)通过在原始数据库中创建/维护一个SORTORDER列来颠覆驱动程序的排序,该列包含相同的单词并去除所有重音字符,或者b)找到一种方法来更改从之后到达的排序司机。这些都不是可取的,所以我希望开发人员提供的解决方法足够。

,

默认情况下,Java不执行对语言环境敏感的字符串比较。 在您的示例中,我尝试按照以下运行程序进行自然排序

 List<String> strings = Arrays.asList(new String[]{"óbito","fanatico","orbita","fanático","fanta","órbita","fantástico","obito","obituario","orbitando"});
    
    Collections.sort(strings);
    System.out.println("Output = " + strings);

输出为

Output = [fanatico,fanta,fantástico,fanático,obito,obituario,orbita,orbitando,óbito,órbita]

现在突出显示,只需替换下面的行

Collections.sort(strings,Collator.getInstance(Locale.US));

我得到了您期望的输出

Output = [fanatico,órbita,orbitando]

上面的示例为您提供了与语言环境敏感的字符串比较,以了解它们之间的区别。您可以通过多种方式从代码或数据库配置中解决此问题。

例如,您可以查看here

,

您尝试强制执行CharSet吗?

在这里CharSet for MS Access '97 DB using UCanAccess

class DatabaseOpener : JackcessOpenerInterface {
  override fun open(fl: File,pwd: String?): Database {
    return DatabaseBuilder.open(fl).apply {
      this.charset = charset("Cp1252")
    }
  }
}

// URL
"jdbc:ucanaccess://<path-to-mdb-file>;memory=false;jackcessOpener=${DatabaseOpener::class.qualifiedName!!}"


使用纯JDBC连接时,您可以尝试添加连接参数:

private static java.sql.ResultSet executeDataTable(String sql) throws Exception {
    Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
    String conStr = "jdbc:ucanaccess://" + dataDir + "ABC.mdb";
    Properties props = new java.util.Properties();
    props.put("charSet","Cp1252");
    java.sql.Connection con = java.sql.DriverManager.getConnection(conStr,props);

    java.sql.Statement stmt = con.createStatement();
    return stmt.executeQuery(sql);
}

您需要检查您的字符集可能是什么。因此有可能替换为“ Cp1252”。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-