2014-12-06 10 views
6

Sto facendo un Sistema di Gestione della Biblioteca, sto cercando di aggiungere il supporto araba nel mio progetto, ma io sono in difficoltà come segue,Recupero arabo dalla colonna MSSQL NVARCHAR

  1. durante l'inserimento dei dati in SQL tramite query cioè Insert into book_info values(25, N'جاوا', N'Author',N'Publisher',2014,N'Subject',50,N'Language','Latest',5) l'elenco delle colonne in book_info è la seguente

    • Prenota ID (int)
    • Titolo libro (nvarchar (50))
    • Autore (NVA rchar (50))
    • Editore (nvarchar (50))
    • Pubblicare Anno (int)
    • Soggetto (nvarchar (50))
    • Prezzo (int)
    • Language (nvarchar (50))
    • Edition (nvarchar (50))
    • parte (int)

    quindi quando eseguo questa query attraverso il mio progetto, SQL Management Studio mostra alcuni codificato Personaggi come 'مجتبیٰ' al posto di caratteri arabi, e non solo in SQL Management Studio ma anche quando si selezionano i dati nel progetto. Nota: questi valori a richiesta sono presi da textfield attraverso .getText() funzione

  2. E se saltiamo il primo problema eseguendo la query in SQL Management Studio, in questo modo il primo problema viene risolto temporaneamente come SQL Management Studio sta mostrando i caratteri arabi quando si seleziona i dati, ma ancora una volta quando selezioniamo dal nostro software e mostrarlo in da ottenere dati da ResultSet come "TextF.setText(ResultS.getNString())" mostra "??????" nel campo di testo al posto di caratteri arabi.

+0

non riesco a riprodurre il problema, che non è sorprendente. Nvarchar di SQL Server non richiede alcun trattamento speciale per archiviare qualsiasi carattere Unicode. Il problema è sempre una conversione durante il caricamento o la lettura dei dati, in genere cercando di "aiutare" il database codificando la codepage errata. Dov'è il codice che inserisce i dati nel database o lo legge? Sei * assolutamente * sicuro di passare le stringhe Unicode? Hai provato a utilizzare query parametrizzate in modo da non dover creare stringhe con i valori? –

+0

I colpevoli più probabili sono i metodi getText, setText. Sospetto che assumano che le stringhe che passi siano stringhe ASCII, risultanti in errori di conversione (che sono rappresentati dai caratteri '???') –

+0

@PanagiotisKanavos In realtà sto usando una query parametrizzata non una query hard coded e sapevo che Nvarchar ha bisogno nessun trattamento speciale Sono d'accordo che molto probabilmente i colpevoli sono i metodi getText e setText e anche il Vettore In cui sto memorizzando i dati – JProgrammer

risposta

1

tua definizione di database, query e istanza SQL va bene. Il problema che stai avendo è con la lettura della stringa dal database in Java.

Penso che Java stia cercando di leggere il testo nvarchar come caratteri ASCII, quando sono effettivamente in Unicode. Il risultato è un testo dall'aspetto confuso. Penso che quando leggi il testo dal database, devi assicurarti di leggere come Unicode.

Se è possibile inserire il codice, potrei probabilmente individuare ciò che sta causando problemi.

+0

Puoi per favore mostrarmi il modo giusto per ottenere i dati – JProgrammer

+0

qui ho un ResultSet 'rs' che contiene 1 riga della tabella descritta in questione, come mostrare quella riga in set di campi di testo o Jtable. – JProgrammer

+0

Penso che tu abbia capito bene, questa linea ha fatto il lavoro 'System.setProperty (" file.encoding "," UTF-8 ");' – JProgrammer

0

Provate utilizzando l'istruzione COLLATE in questo modo:

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 
+1

I campi Unicode non hanno bisogno di regole di confronto per gestire i dati Unicode. –

1

Dopo aver trascorso ore alla ricerca per la causa e consulenza miei superiori mi sono la soluzione, insomma ho dovuto codificare il risultato in entrata set in UTF-8 codifica (Unicode), ecco come ho fatto:

Crea tabella di colonne con nvarchar() come tipo di dati in cui è necessario inserire testo bidirezionale, quindi utilizzare le seguenti query per inserire, aggiornare, selezionare ed eliminare (la tabella di esempio ha solo una colonna i.e di nvarchar() tipo di dati)

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'عرب' 

mentre in Java, ci sono molti modi per connettersi con SQL ed eseguire query come io uso bridge JDBC-ODBC in Windows per connettersi a SQL, ecco come lo faccio

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 
} 

si noti che per l'esecuzione di tutte le query che non produce un insieme di risultati usiamo PreparedStatement.execute() funzione