为什么阿拉伯字母没有插入数据库?
我正在帮助我的一个朋友。 他正在使用JSF 2.0和mysql创建Web应用程序。
在创建数据库时,他使用了以下查询。
CREATE DATABASE dbName DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
截止日期网站工作正常。 今天客户端尝试输入阿拉伯语文本,他们说输出结果很奇怪。 我的朋友做的是在将数据输入DB之后,他还在另一页上打印相同的数据说Congratulations, XYZ ABC is added successfully
。 但他认为输出是Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully
Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully
Congratulations, Ù?ظاÙ? تÙ?Ù?Ù?Ø© Ù?تÙ?Ù?Ù? صدÙ?Ù? Ù?Ù?بÙ?ئة is added successfully
。 当数据库字符设置正确时,我不明白为什么他会这样。
web.xml内容如下。
javax.faces.PROJECT_STAGE Development Faces Servlet javax.faces.webapp.FacesServlet 1 Faces Servlet /faces/* 600 faces/index.xhtml restrict com.sac.filter.MyFilter restrict *.xhtml MyFacesExtensionsFilter org.apache.myfaces.webapp.filter.ExtensionsFilter MyFacesExtensionsFilter Faces Servlet DisplayImage com.sac.databean.DisplayImage DisplayImage /DisplayImage SaveMyImage com.sac.databean.SaveMyImage SaveMyImage /SaveMyImage org.richfaces.SKIN plain org.richfaces.LoadStyleStrategy None org.richfaces.enableControlSkinning false
在每个.xhtml页面上,他有
如果您还有其他需要,请告诉我。
编辑1
在我的JSFfilter中,我还添加了req.setCharacterEncoding("UTF-8");
在doFilter()
。 还在数据库中我看到???????????
编辑2
在JSF页面中,我有当我在Java bean中打印
fullName
值为System.out.println("my name while entering is " + fullName);
我输入时输出的是my name while entering is ???????????? ????
my name while entering is ???????????? ????
。
这意味着输入数据时会出现问题
有人可以帮助ODD吗?
但他认为输出是祝贺,Ù?ظاÙ? تÙ?Ù?Ù?Ø©Ù?تÙ?Ù?Ù? ØμدÙ?U& Ù?Ù?ب??Ø|Ø©成功添加。 当数据库字符设置正确时,我不明白为什么他会这样。
这被称为Mojibake 。 这不是数据库编码问题,而是HTTP编码问题。 像你一样设置POST请求字符编码确实是正确的解决方案。
编辑1:在我的JSFfilter中,我还添加了
req.setCharacterEncoding("UTF-8");
在doFilter()
。 还在数据库中我看到???????????
当连接的两端都知道自己的编码时,会出现问号。 未被一侧编码覆盖的已发送/检索字符将替换为问号。 ISO-8859-1中没有出现阿拉伯字符,因此它们被问号取代。 这与Mojibake的区别在于,在不检查对方使用的编码是否真的支持该角色的情况下发送了字符。 你最终会得到错误编码的字符,这些字符本身就是一个难以理解的字符序列。
在这种特殊情况下,JDBC驱动程序本身就知道它默认使用ISO-8859-1将字符传输到DB,而检索到的字符是UTF-8(MySQL JDBC驱动程序不查看数据库)表编码,即使它在你的情况下被正确设置为UTF-8)。 在将数据传输到DB之前,您需要明确告诉JDBC驱动程序使用UTF-8来解码字符。 这将作为JDBC连接属性来完成,这些属性在JDBC URL中被定义为查询字符串参数,如下所示:
jdbc:mysql://localhost:3306/db_name?useUnicode=yes&characterEncoding=UTF-8
如果您使用的是容器管理的数据源,那么只需单独指定这些属性,就像使用用户名和密码一样
useUnicode=yes characterEncoding=UTF-8
也可以看看:
- Unicode – 如何使角色正确?