从MSSQL NVarchar列中检索阿拉伯语文本

时间:2014-12-06 10:26:50

标签: java sql-server resultset arabic nvarchar

我正在建立一个图书馆管理系统,我正在尝试在我的项目中添加阿拉伯语支持,但我面临如下困难,

  1. 通过查询在SQL中插入数据时,Insert into book_info values(25, N'جاوا', N'Author',N'Publisher',2014,N'Subject',50,N'Language','Latest',5) book_info中的列列表如下

    • 图书ID(int)
    • 书名(NVarchar(50))
    • 作者(NVARCHAR(50))
    • 出版社(NVARCHAR(50))
    • 发布年份(int)
    • 主题(NVARCHAR(50))
    • 价格(int)的
    • 语言(NVARCHAR(50))
    • 版(NVARCHAR(50))
    • 部分(INT)

    因此,当我通过我的项目执行此查询时,SQL Management Studio显示一些编码字符,如'مجتبیٰ'代替阿拉伯字符,不仅在SQL Management Studio中,而且在项目中选择数据时。注意:查询中的这些值取自textfield.getText()函数

  2. 如果我们在SQL Management Studio执行查询时跳过第一个问题怎么办?第一个问题暂时解决,因为SQL Management Studio在选择数据时显示阿拉伯字符但是当我们从我们的软件中选择它并在Textfield中显示时,从ResultSet获取数据,如“TextF.setText(ResultS.getNString())”,它会在文本字段中显示“??????”来代替阿拉伯语字符。

3 个答案:

答案 0 :(得分:1)

您的数据库定义,查询和SQL实例都可以。您遇到的问题是将数据库中的字符串读入java。

我认为Java正在尝试将nvarchar文本作为ASCII字符读取,而实际上它们是Unicode。结果是看起来乱码的文字。我想当你从数据库中读取文本时,你需要确保你以Unicode的形式阅读。

如果你可以发布你的代码,我可能会找出导致你问题的原因。

答案 1 :(得分:1)

花了几个小时寻找原因并咨询我的老年人后,我得到了解决方案,简而言之,我只需要将传入的结果集编码为UTF-8(Unicode)编码,这就是我的方法:

使用nvarchar()作为数据类型创建列表,您必须在其中插入双向文本,然后使用以下查询来插入,更新,选择和删除(示例表只有一列,即nvarchar()数据类型)

INSERT INTO table_name VALUES(N'عربی ABC')
SELECT FROM table_name WHERE column_name LIKE N'عربی%'
UPDATE table_name SET column_name = N'عرب' WHERE column_name like N'%ABC'
DELETE FROM table_name WHERE column_name = N'عرب'

在Java中,有很多方法可以连接SQL并执行查询,例如我在Windows中使用JDBC-ODBC桥连接到SQL,这是我的工作方式

Connection cn=null;
ResultSet rs=null;
PreparedStatement ps=null;
String password = *******;
String data;
public static Connection conn() throws ClassNotFoundException,SQLException
{
    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    String url="jdbc:odbc:library_management";
    return DriverManager.getConnection(url,"sa", password );
}

// the library_management is the connection name which is made in Windows 'ODBC Data Sources' 
// Now suppose an event is fired which calls a method given below

public void executeQ(){
    try {
        cn = conn();
        ps = cn.prepareStatement("SELECT FROM table_name WHERE column_name LIKE N'عربی%'");
        rs = ps.executeQuery();
        while(rs.next()){
             data = rs.getString(1);       
        }
    } catch (ClassNotFoundException | SQLException ex) {
        ex.printStackTrace();
    }
}

// this method should work according to the need but since windows default encoding is a non-unicode encoding , therefore it forcibly runs a JAR file on its own encoding so for avoiding this we add a line of code in the main method of the main class of the project.
public static void main(String args[]) {
    System.setProperty("file.encoding","UTF-8");
    // Any code
}

请注意,为了执行任何不产生结果集的查询,我们只使用PreparedStatement.execute()函数

答案 2 :(得分:0)

尝试使用COLLATE语句,如下所示:

CREATE TABLE #book_info
(
Book_ID int,
Book_Title NVarchar(50) COLLATE Arabic_ci_as,
Author NVarchar(50),
Publisher NVarchar(50),
Publish_Year int,
Subject NVarchar(50),
Price int,
Language NVarchar(50),
Edition NVarchar(50),
Part int
)

Insert into #book_info values(25, N'جاوا', N'Author',N'Publisher',2014,N'Subject',50,N'Language','Latest',5) 

SELECT *
FROM #book_info