请问如何在serverlet中执行含有阿拉伯字符的sql语句?很急! 没问题,aaa是nvarchar的我在查询分析器中可以直接插入阿拉伯字符 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 阿拉伯文可能是win下面编码是CP1256,new InputStreamReader(InputStream,String)String是你使用的编码方案详细的解释在<<Java 2 核心技术 卷I>>p466页 我有个问题想问IIS能绑定ServerLet吗 那如果有别的文字不就不行了吗?而且现在我显示和从数据库中取得都没问题,就是无法插入,是不是应该是执行sql语句的函数又问题??? 可能是我说的不清楚,如果我的sql语句中有多国语言应该怎么执行?? 请大家帮我想想办法把!!是不是jdbc的接口又问题?? 我 也 有 同 样 的 疑 问 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~比如select aaa from bbb where aaa like '%阿拉伯文+日文+中文+意大利文%'库中存放的是真实的各国文字不是乱码 上面的SQL语句可以在查询分析器里面正确的执行 可是在程序里就查询不到数据实际情况是 : 这个SQL语句的多语种部分是SERVLET提交过来的 aaaaa=new String(request.getParameter("input").getBytes("8859_1"),"UTF-8"); String sqlstr="select aaa from bbb where aaa like N'%"+aaaaa+"%'"; out.println("sqlstr="+sqlstr);//在IE上显示这个SQL语句都没有问题 ResultSet rs=st.executeQuery(sqlstr);//但是执行就查不到记录 1 我可以把整个SQL语句打印到网页上 而且网页上显示的这个SQL语句里面就是多国的语言 没有乱码 2 把这句SQL语句从网页上COPY到SQLSERVER的查询分析器里面 可以得到正确的结果 而且数据 库里存放的数据都是原文 不是乱码 字段类型是“NVARCHAR”3 我用JOptionPane.showMessageDialog 在程序里弹出MESSAGEBOX 都可以看到正确的SQL语句4 如果检索点里不包含多国语言 程序运行结果就是对的 一旦检索点里面包含小语种就检索不 到结果5 如果把语句换成 insert into aaa values (N'"+aaaaa+"')" 插入库中的全是问号不知道哪为高手能帮我解决这个问题 谢谢!!!!!!!!!! للدخول على الصفحة الرئيسية مباشرةhttp://www.mmaa.gov.qa/ 环境是 PROFESSIONAL 2000 + SQLSERVER2000 + JB5 抱歉 我这里上不了MSN 数据库是 936 Chinese(Simplified) aaaaa=new String(request.getParameter("input").getBytes("8859_1"),"UTF-8"); String sqlstr="select aaa from bbb where aaa like N'%"+aaaaa+"%'"; out.println("sqlstr="+sqlstr);//在IE上显示这个SQL语句都没有问题 ResultSet rs=st.executeQuery(sqlstr);//但是执行就查不到记录 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 将划线的这一句也做一次转换试试看ISO-8859-1 SQLSRERVER要有支持阿拉波文的字符集 提交: private static final String CONTENT_TYPE = "text/html; charset=UTF-8"; response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.print("<form action=\""); out.print("ffffff.Servlet1\" "); out.println("method=POST>"); aaaaa=new String(request.getParameter("firstname").getBytes ("8859_1"),"GB2312");连库: String url="jdbc:odbc:aa"; //aa是数据源 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con=DriverManager.getConnection(url,"sa",""); Statement st=con.createStatement();执行SQL: String sqlstr="insert into aaa values ('"+aaaaa+"')"; ResultSet rs=st.executeQuery(sqlstr); 请看我下面的代码,在sqlserver2000,ie5.5下测试完全可以处理中日韩三国文字,包括三国文字混合输入,至于其它文字我没有测试,不过我想应该没问题://Servlet1.javapackage testunicode;import javax.servlet.*;import javax.servlet.http.*;import java.io.*;import java.util.*;import java.sql.*;public class Servlet1 extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=GBK"; //Initialize global variables public void init() throws ServletException { } //Process the HTTP Get request public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head><title>Servlet1</title></head>"); out.println("<body>"); out.println("<form method=\"post\">Please input:<input name=text type=text><input type=submit value=submit></form>"); out.println("</body></html>"); } //Clean up resources public void destroy() { } public void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException { //response.setContentType(CONTENT_TYPE); PrintWriter out = response.getWriter(); String sbInput = request.getParameter("text"); //sInput = new String(sInput.getBytes(((String enc=request.getCharacterEncoding())!=null)?enc:"")); String sInput = new String(sbInput.getBytes("ISO-8859-1")); try{ Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); } catch(java.lang.ClassNotFoundException e){ e.printStackTrace(out); } Connection conn = null; Statement stmt = null; try{ String sConnStr = "jdbc:microsoft:sqlserver://dbserver:1433"; conn = DriverManager.getConnection(sConnStr,"sa",""); conn.setCatalog("ioffice"); stmt = conn.createStatement(); stmt.executeUpdate("insert into test values(N'"+sInput+"')"); } catch(java.sql.SQLException e){ e.printStackTrace(out); } finally{ try{ stmt.close(); } catch(Exception e){} try{ conn.close(); } catch(Exception e){} } out.println("<html>"); out.println("<head><title>Servlet1</title></head>"); out.println("<body>"); out.println("<p>Your input is : "+sbInput+"</p>"); out.println("</body></html>"); }} 我这有一个笨解决方案,牺牲空间为代价假设有String str存储带入库字符串可以先把str转成byte数组,然后将每个元素柴分成两个4bit再在每个四位前补商人移交小值,这样吧每个字节拆分为两个,可定可传入数据库提取操作时,做反向操作代码如下public String changToDBFormat(String str){ ///beforeChange用于接收由字符串转化而来的字符数组 byte [] beforeChange = new byte[str.getLength()]; ///afterChange用于接收拆分子节后的字符数组 byte [] afterChange = new byte[2*beforeChange.length]; for(int i=0; i < beforeChange.length ; i++) { //0x30可以使任意值,以数据库能接受为标准, //若用0x30,则拆分后的字符为ascii表,由0开始的16各字符 afterChange[i*2] = (byte)((beforeChange[i]<<4)+0x30); afterChange[i*2+1] = (byte)((beforeChange[i]&0x0f)+0x30); } //tempString为反回的字符串 String tempString = new String(afterChange); return tempString;}合并函数如下public String changeBackFromDB(String str){///beforeChange用于接收由字符串转化而来的字符数组 byte [] beforeChange = new byte[str.getLength()]; ///afterChange用于接收拆分子节后的字符数组 byte [] afterChange = new byte[beforeChange.length/2]; for(int i=0; i < afterChange.length ; i++) { afterChange[i] = (byte)((beforeChange[i*2]<<4)+(beforeChange[i*2+1]&0x0f)); } //tempString为反回的字符串 String tempString = new String(afterChange); return tempString;}这样做的结果,存储在数据库的特殊数据常都会增加一倍,运算量也会加大好处时,实现简单,而且通 oracle8.0支不支持我不太清楚,我是这样解决的看对你有没有帮助!String sqlstr="insert into aaa values(?)"; try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con=DriverManager.getConnection(url,"sa",""); Statement st=con.createStatement(); PreparedStatement ps=con.prepareStatement(sqlstr); aaaaa="%"+aaaaa+"%";//aaaaa包含阿拉伯文等小语种 ps.setBytes(1,aaaaa.getBytes("unicode")); ResultSet rs=ps.executeQuery();我用的数据库是sql server2000,希望队你有用! 这个程序改成SERVLET一样可以。把文件存成UTF-8格式,然后用ULTRAEDITOR删除文件的BOM头用javac -encoding utf-8 UnicodeSQl.java编译DB: db2import java.sql.*;public class UnicodeSQL{public static void main(String args[]){ String dbName="Airline1"; String driver = "COM.ibm.db2.jdbc.app.DB2Driver"; String url="jdbc:db2:"+dbName; String userId = "db2admin"; String password= "password"; String searchString = "王"; //You can replace with any other chars String firstName = "卢克"; //You can replace with any other chars String lastName = "王"; //You can replace with any other chars String sqlQuery ="select * from DBTicketInfo where passengerLastName=?"; String sqlInsert = "insert into DBTicketInfo ( AirlineClass,isMale,isAdult,isRoundTrip,Confirmed,PriceforTicket,DepartureDate,ReturnDate,PassengerFirstName,PassengerMiddleName,PassengerLastName,InboundRouteCode,OutboundRouteCode,SpecialRequirement,TicketNumber,InvoiceNumber,AgencyCode) values (1, 1, 1, 1, 1,1,'2000-12-2','2002-1-1', ?, 'W', ?, 'R002', 'R001', 'Hello', 'T000001', 'I0000001', 'MW')"; try{ Class.forName(driver).newInstance(); Connection con = DriverManager.getConnection(url,userId,password); PreparedStatement preState= con.prepareStatement(sqlInsert); preState.setString(1,firstName); preState.setString(2,lastName); preState.executeUpdate(); System.out.println("Insert OK!"); PreparedStatement preState1= con.prepareStatement(sqlQuery); preState1.setString(1,searchString); ResultSet rs = preState1.executeQuery(); if(rs.next()) System.out.println(rs.getString("passengerFirstName")); preState.close(); preState1.close(); con.close(); } catch(SQLException se){ System.out.println(se); }catch(Exception e){ System.out.println(e); }}} easy.最土的方法就是用base64encode一下。sqlstr="insert into xxx value('"+base64encode(astr)+"')"; 用java怎么编写一个班级类 看到 下面代码之后 看看谁能猜出更多蛛丝马迹??? struts-里的parameter的问题,在线等待 JTextArea 对齐方式 socket连接建立后,如何判断这个socket连接没有通讯? 这样一个问题居然难了我一上午了... 一个关于接口的问题 网页连接问题? apache+tomcat配置成功,但只有http://localhost/examples能用,为什么(shenzhipeng) 菜问题:如何进行数据类型的转化,比如int转化为string 关于jbuilder的使用问题 Java中方法调用到底是按值,还是按引用???
new InputStreamReader(InputStream,String)
String是你使用的编码方案
详细的解释在<<Java 2 核心技术 卷I>>p466页
IIS能绑定ServerLet吗
而且现在我显示和从数据库中取得都没问题,就是无法插入,是不是应该是执行sql语句的函数又问题???
库中存放的是真实的各国文字不是乱码 上面的SQL语句可以在查询分析器里面正确的执行
可是在程序里就查询不到数据实际情况是 :
这个SQL语句的多语种部分是SERVLET提交过来的
aaaaa=new String(request.getParameter("input").getBytes("8859_1"),"UTF-8");
String sqlstr="select aaa from bbb where aaa like N'%"+aaaaa+"%'";
out.println("sqlstr="+sqlstr);//在IE上显示这个SQL语句都没有问题
ResultSet rs=st.executeQuery(sqlstr);//但是执行就查不到记录 1 我可以把整个SQL语句打印到网页上 而且网页上显示的这个SQL语句里面就是多国的语言
没有乱码 2 把这句SQL语句从网页上COPY到SQLSERVER的查询分析器里面 可以得到正确的结果 而且数据
库里存放的数据都是原文 不是乱码 字段类型是“NVARCHAR”3 我用JOptionPane.showMessageDialog 在程序里弹出MESSAGEBOX 都可以看到正确的SQL语句4 如果检索点里不包含多国语言 程序运行结果就是对的 一旦检索点里面包含小语种就检索不
到结果5 如果把语句换成 insert into aaa values (N'"+aaaaa+"')" 插入库中的全是问号不知道哪为高手能帮我解决这个问题 谢谢!!!!!!!!!!
http://www.mmaa.gov.qa/
数据库是 936 Chinese(Simplified)
String sqlstr="select aaa from bbb where aaa like N'%"+aaaaa+"%'";
out.println("sqlstr="+sqlstr);//在IE上显示这个SQL语句都没有问题
ResultSet rs=st.executeQuery(sqlstr);//但是执行就查不到记录
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
将划线的这一句也做一次转换试试看ISO-8859-1
提交:
private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter(); out.print("<form action=\"");
out.print("ffffff.Servlet1\" ");
out.println("method=POST>"); aaaaa=new String(request.getParameter("firstname").getBytes ("8859_1"),"GB2312");连库:
String url="jdbc:odbc:aa"; //aa是数据源
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection(url,"sa","");
Statement st=con.createStatement();执行SQL:
String sqlstr="insert into aaa values ('"+aaaaa+"')";
ResultSet rs=st.executeQuery(sqlstr);
package testunicode;import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.sql.*;public class Servlet1 extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>Servlet1</title></head>");
out.println("<body>");
out.println("<form method=\"post\">Please input:<input name=text type=text><input type=submit value=submit></form>");
out.println("</body></html>");
}
//Clean up resources
public void destroy() {
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, java.io.IOException {
//response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
String sbInput = request.getParameter("text");
//sInput = new String(sInput.getBytes(((String enc=request.getCharacterEncoding())!=null)?enc:""));
String sInput = new String(sbInput.getBytes("ISO-8859-1"));
try{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
}
catch(java.lang.ClassNotFoundException e){
e.printStackTrace(out);
}
Connection conn = null;
Statement stmt = null;
try{
String sConnStr = "jdbc:microsoft:sqlserver://dbserver:1433";
conn = DriverManager.getConnection(sConnStr,"sa","");
conn.setCatalog("ioffice");
stmt = conn.createStatement();
stmt.executeUpdate("insert into test values(N'"+sInput+"')");
}
catch(java.sql.SQLException e){
e.printStackTrace(out);
}
finally{
try{
stmt.close();
}
catch(Exception e){}
try{
conn.close();
}
catch(Exception e){}
}
out.println("<html>");
out.println("<head><title>Servlet1</title></head>");
out.println("<body>");
out.println("<p>Your input is : "+sbInput+"</p>");
out.println("</body></html>");
}
}
假设有String str存储带入库字符串
可以先把str转成byte数组,然后将每个元素柴分成两个4bit再在每个四位前补商人移交小值,这样吧每个字节拆分为两个,可定可传入数据库
提取操作时,做反向操作
代码如下
public String changToDBFormat(String str)
{
///beforeChange用于接收由字符串转化而来的字符数组
byte [] beforeChange = new byte[str.getLength()];
///afterChange用于接收拆分子节后的字符数组
byte [] afterChange = new byte[2*beforeChange.length];
for(int i=0; i < beforeChange.length ; i++)
{
//0x30可以使任意值,以数据库能接受为标准,
//若用0x30,则拆分后的字符为ascii表,由0开始的16各字符
afterChange[i*2] = (byte)((beforeChange[i]<<4)+0x30);
afterChange[i*2+1] = (byte)((beforeChange[i]&0x0f)+0x30);
}
//tempString为反回的字符串
String tempString = new String(afterChange);
return tempString;}合并函数如下
public String changeBackFromDB(String str)
{
///beforeChange用于接收由字符串转化而来的字符数组
byte [] beforeChange = new byte[str.getLength()];
///afterChange用于接收拆分子节后的字符数组
byte [] afterChange = new byte[beforeChange.length/2];
for(int i=0; i < afterChange.length ; i++)
{
afterChange[i] = (byte)((beforeChange[i*2]<<4)+(beforeChange[i*2+1]&0x0f));
}
//tempString为反回的字符串
String tempString = new String(afterChange);
return tempString;
}这样做的结果,存储在数据库的特殊数据常都会增加一倍,运算量也会加大
好处时,实现简单,而且通
String sqlstr="insert into aaa values(?)";
try{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con=DriverManager.getConnection(url,"sa","");
Statement st=con.createStatement();
PreparedStatement ps=con.prepareStatement(sqlstr);
aaaaa="%"+aaaaa+"%";//aaaaa包含阿拉伯文等小语种
ps.setBytes(1,aaaaa.getBytes("unicode"));
ResultSet rs=ps.executeQuery();
我用的数据库是sql server2000,希望队你有用!
把文件存成UTF-8格式,然后用ULTRAEDITOR删除文件的BOM头
用javac -encoding utf-8 UnicodeSQl.java编译
DB: db2import java.sql.*;public class UnicodeSQL{public static void main(String args[]){
String dbName="Airline1";
String driver = "COM.ibm.db2.jdbc.app.DB2Driver";
String url="jdbc:db2:"+dbName;
String userId = "db2admin";
String password= "password";
String searchString = "王"; //You can replace with any other chars
String firstName = "卢克"; //You can replace with any other chars String lastName = "王"; //You can replace with any other chars
String sqlQuery ="select * from DBTicketInfo where passengerLastName=?";
String sqlInsert =
"insert into DBTicketInfo ( AirlineClass,isMale,isAdult,isRoundTrip,Confirmed,PriceforTicket,DepartureDate,ReturnDate,PassengerFirstName,PassengerMiddleName,PassengerLastName,InboundRouteCode,OutboundRouteCode,SpecialRequirement,TicketNumber,InvoiceNumber,AgencyCode) values (1, 1, 1, 1, 1,1,'2000-12-2','2002-1-1', ?, 'W', ?, 'R002', 'R001', 'Hello', 'T000001', 'I0000001', 'MW')"; try{
Class.forName(driver).newInstance();
Connection con = DriverManager.getConnection(url,userId,password); PreparedStatement preState= con.prepareStatement(sqlInsert);
preState.setString(1,firstName);
preState.setString(2,lastName);
preState.executeUpdate(); System.out.println("Insert OK!"); PreparedStatement preState1= con.prepareStatement(sqlQuery);
preState1.setString(1,searchString); ResultSet rs = preState1.executeQuery();
if(rs.next())
System.out.println(rs.getString("passengerFirstName"));
preState.close();
preState1.close();
con.close();
}
catch(SQLException se){
System.out.println(se);
}
catch(Exception e){
System.out.println(e);
}
}}
sqlstr="insert into xxx value('"+base64encode(astr)+"')";