Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过Java从MS Access 2007数据库中读取Unicode字符?_Java_Sql_Ms Access_Unicode_Utf 8 - Fatal编程技术网

如何通过Java从MS Access 2007数据库中读取Unicode字符?

如何通过Java从MS Access 2007数据库中读取Unicode字符?,java,sql,ms-access,unicode,utf-8,Java,Sql,Ms Access,Unicode,Utf 8,在Java中,我编写了一个读取UTF8文本文件的程序。文本文件包含SELECT类型的SQL查询。然后,程序在Microsoft Access 2007数据库上执行查询,并将第一行的所有字段写入UTF8文本文件 我遇到的问题是,返回的行包含unicode字符,例如“♪". 这些字符在文本文件中显示为“?” 我知道文本文件读写正确,因为一个伪UTF8字符(“◎)从包含SQL查询的文本文件中读取,并写入包含结果行的文本文件。在记事本中打开写入的文本文件时,UTF8字符看起来是正确的,因此文本文件的读取

在Java中,我编写了一个读取UTF8文本文件的程序。文本文件包含SELECT类型的SQL查询。然后,程序在Microsoft Access 2007数据库上执行查询,并将第一行的所有字段写入UTF8文本文件

我遇到的问题是,返回的行包含unicode字符,例如“♪". 这些字符在文本文件中显示为“?”

我知道文本文件读写正确,因为一个伪UTF8字符(“◎)从包含SQL查询的文本文件中读取,并写入包含结果行的文本文件。在记事本中打开写入的文本文件时,UTF8字符看起来是正确的,因此文本文件的读取和写入不是问题的一部分

以下是我连接数据库的方式和执行SQL查询的方式:

Connection c = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:/database.accdb;Pwd=temp");

ResultSet r = c.createStatement().executeQuery(sql);
我已尝试为连接创建一个字符集属性,但没有任何区别:

Properties p = new Properties();
p.put("charSet", "utf-8");
p.put("lc_ctype", "utf-8");
p.put("encoding", "utf-8");
Connection c = DriverManager.getConnection("...", p);
尝试使用“utf8”/“utf8”/“UTF-8”,没有区别。如果输入“UTF-16”,则会出现以下异常:

java.lang.IllegalArgumentException: Illegal replacement 该示例所做的是,它打开用密码“pass”加密的数据库“dummy.accdb”,并从表“main”中取出第一篇文章。然后,它读取文本文件“utf8.txt”,并写入一个文本文件“results.txt”,其中将包含第一行“utf8.txt”以及它从数据库获得的字段“content”的值

在文件“utf8.txt”中“我已存储”♜♞♝♛♚♝♞♜♟♖♘♗♕♔♗♘♖♙". 在数据库的“main”表的“content”字段中,我存储了♫♪あキタℳℴℯ♥∞۞♀♂“

应用程序完成运行后,“results.txt”包含以下内容:♜♞♝♛♚♝♞♜♟♖♘♗♕♔♗♘♖♙ : ?????教育部?8

它成功地读写了“UTF8.txt”文本文件中的UTF8字符,但未能从数据库中获取正确的字符。这就是问题所在


更新。我想我应该提到数据库中的字段是“memo”类型,我已经尝试将“Unicode压缩”设置为“否”和“是”(在两次尝试之间重新创建帖子,以确保在选择“否”时没有压缩)。据我所知,Access在保存Unicode字符时使用UTF-16,但压缩后会更改为UTF-8。无论如何,这都没有任何区别

另外一个问题是,有人知道如何使用Java中的纯ODBC提供程序或任何其他类型的方法连接到数据库吗?这将为我提供一个很好的解决方法


更新。我一直在尝试将以下四个内容提供给getConnection:

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./dummy.accdb"
"jdbc:odbc:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./dummy.accdb"
"jdbc:odbc:Driver={Microsoft.Jet.OLEDB.4.0};Data Source=./dummy.accdb"
"jdbc:odbc:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=./dummy.accdb"
第一个错误是“java.sql.SQLException:没有为Provider=Microsoft.Jet.OLEDB.4.0找到合适的驱动程序;数据源= ./哑.ACDB“中间的两个”java. q.L.qLeExp:[微软] [ODBC驱动程序管理器]未找到数据源名称,并且没有指定默认驱动程序。“最后一个得到”java. qq.sqExExc:[微软] [ODBC驱动程序管理器]数据源名称太长“.< /P>” 我不明白getConnection想要什么。参数描述如下:“url-一个数据库url,格式为jdbc:subtocol:subname”。哈?我显然不明白这意味着什么


有人知道通过Java连接Access 2007数据库的其他工作方式吗?可能我尝试过的提供程序不受支持,但其他提供程序可能受支持?

既然您提到可以切换到Access以外的其他数据库,我敦促您这样做。在Microsoft Office产品上制作软件一直是一项维护工作对我来说是噩梦,所以请从列表中选择其他内容:


为此,我会选择Apache Derby,或者只使用随当前任何Sun Java安装一起预装的Java数据库JavaDB(实际上是重新打包的Derby DB)

utf-8不受支持:


使用jdbc访问的另一种选择是库。使用该库的优点是没有问题的转换层(如odbc)或任何外部系统依赖项。使用此库的缺点是它不支持执行查询。

既然Java SE 8中已删除JDBC-ODBC桥接器,并且Oracle已确认此问题将永远无法解决(参考:),那么最好使用此库。有关更多信息,请参阅


您需要发布一个简单的、自包含的示例来演示这个问题,因为根据这里的答案:,
p.put(“charSet”,“UTF8”)
应该可以工作,因为您使用的是JDBCODBC桥()。在文件方面,您说您确定文件是以UTF8格式编写的(你一定是故意这么做的;Java的默认设置是平台编码,这几乎肯定不是UTF8)。@Crowder:“这几乎肯定不是UTF8"对Windows来说也是如此。大多数现代Linux发行版都使用UTF-8。我知道这与这个问题没有直接关系,我只是想避免任何人认为这句话在所有情况下都是正确的。@T.J.Crowder:好的,我已经做了一个自成体系的例子,只是想弄清楚如何与大家分享它。原始帖子已经编辑成c关于这个例子,请看一看,并给我你的意见。非常感谢。@T.J Crowder:顺便说一下,你提到的那篇文章的答案是过时的,它可能是五年前写的(底部的版权声明是2002)。例如,今天那篇文章中使用的一些关键类不能使用“sun.jdbc.odbc.JdbcOdbcDriver”、“sun.jdbc.odbc.ee.DataSource”和“sun.jdbc.odbc.ee.ConnectionPoolDataSource”。它们要么有访问限制,要么根本无法解决。设置“charSet”在过去可能曾经有效过一次,但遗憾的是,现在不起作用。
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./dummy.accdb"
"jdbc:odbc:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=./dummy.accdb"
"jdbc:odbc:Driver={Microsoft.Jet.OLEDB.4.0};Data Source=./dummy.accdb"
"jdbc:odbc:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=./dummy.accdb"