首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

JAVA运用sqlite数据库的like语句查询失败,而且中文是乱码

2012-12-23 
JAVA使用sqlite数据库的like语句查询失败,而且中文是乱码。在Windows7里,用Java7和sqlite3,想写一个图书管

JAVA使用sqlite数据库的like语句查询失败,而且中文是乱码。
在Windows7里,用Java7和sqlite3,想写一个图书管理程序,但是使用sqlite的like查询语句没有查到相关的结果,而在命令行下用sqlite3.exe命令执行相同的查询语句却有结果。详细代码如下:
Java里面的相关代码:


//用书名查询书籍信息
private void QueryByName()throws Exception
{
// TODO Auto-generated method stub
String name;
System.out.print("请输入要查找的书名:");
Scanner scanner = new Scanner(System.in);
name = scanner.next();
String querySql = "select book.BookID,book.BookName,book.BookPage,author.Author,author.Translater,type.TypeName"
         + " from book,author,type where book.BookName like "%"
         + name + "%" and author.BookID = book.BookID and "
         + "book.TypeID = type.TypeID;";
System.out.println(querySql);
System.in.read();
ResultSet rs = null;
DataBase database = null;
try
{
database = new DataBase();
database.InitDatabase("book.db");
rs = database.RunQuery(querySql);
if (!rs.next())
{
System.out.println("没有结果......");
System.in.read();
}
int n = 0;
while (rs.next())
{
System.out.println("书籍ID:" + rs.getInt("BookID"));
System.out.println("书籍名称:" + rs.getString("BookName"));
System.out.println("书籍页数:" + rs.getInt("BookPage"));
System.out.println("作者:" + rs.getString("Author"));
System.out.println("译者:" + rs.getString("Translater"));
System.out.println("书籍分类:" + rs.getString("TypeName"));
n++;
}
System.out.println("共有" + n + "项结果。");
System.out.println("查询结果输出完毕,按回车键继续......");
System.in.read();
System.in.read();
}
catch (Exception e)
{
System.out.println("查询书籍信息出错!详细信息:" + e.getMessage() +
           "请按回车键继续......");
System.in.read();
System.in.read();
return;
}
finally
{
if (rs != null)
{
rs.close();
}
database.CloseDatabase();
}
}

其中RunQuery是另一个类里的成员函数

public ResultSet RunQuery(String sql)throws Exception
{
ResultSet rs;
rs = state.executeQuery(sql);
return rs;
}

程序的插入数据的功能已经完成,并通过该功能插入了一些测试数据,下面是在Windows7命令行下执行sqlite3.exe book.db的结果:

sqlite> .schema
CREATE TABLE [author] (
[BookID] INTEGER PRIMARY KEY,
[Translater] VARCHAR(100),
[Author] VARCHAR(100) not null);
CREATE TABLE [book] (
[BookID] INTEGER primary key autoincrement,
[BookName] VARCHAR(100) not null,
[BookPage] INTEGER not null,
[TypeID] INTEGER not null);
CREATE TABLE [type] (
[TypeID] INTEGER PRIMARY KEY,
[TypeName] VARCHAR(100) not null);
sqlite> select * from book;
2|sdf|34|342
3|sdf|4334|434
4|dsfds|344|545
32|sdfs|43|434
345|鍝堝搱|324|3428
2324|娴嬭瘯|3543|234235
3324|浣犲ソ|323|344323

在命令行下就是有乱码,不是复制上来才有的。
下面执行最前面贴出的那段JAVA代码的功能:

请输入要查找的书名:sdf


select book.BookID,book.BookName,book.BookPage,author.Author,author.Translater,type.TypeName from book,author,type where book.BookName like "%sdf%" and author.BookID = book.BookID and book.TypeID = type.TypeID;

共有0项结果。
查询结果输出完毕,按回车键继续......


可以看到,这里出错了,数据库里明明有书名为"sdfs"这本书的,另外还有两本"sdf"的书。
这是在Eclipse里执行的结果。在命令行里用java命令执行,结果一样的。
把这里输出的查询语句复制到sqlite3.exe的命令行里执行,结果如下:

sqlite> select book.BookID,book.BookName,book.BookPage,author.Author,author.Translater,type.TypeName from book,author,ty
pe where book.BookName like "%sdf%" and author.BookID = book.BookID and Book.TypeID = type.TypeID;
32|sdfs|43|寮犱笁|鏉庡洓|/sdf/dff
sqlite>

可以看到是相同的查询语句是有结果的(尽管这个结果也不对,应该有3个结果的)。
我在网上搜了,说是字符编码的问题,但是我在Eclipse里Edit->Encoding里无论选择"Default(inherited from container:GBK)"还是选择 "Other:GBK",问题依旧。选"Other:utf8",中文变成乱码。选其他的Utf16等,源代码直接变成乱码。
请问是我查询语句错了吗?谢谢。
[解决办法]
确实只能是字符集问题,检查你数据库所使用的字符集吧。

如果可能,将数据库重新创建,并选用UTF-8作为字符集;Java源码也使用UTF-8;是比较稳妥的做法。

否则就面临要尝试用代码来进行硬转码。

比如:
String dbBookName = new String(bookName.getBytes("UTF-8"), "GBK");
[解决办法]
sqlite3使用的就是Unicode编码,问题出现在运行Java程序的编码不是UTF-8

热点排行