为什么阿拉伯字母没有插入数据库?

我正在帮助我的一个朋友。 他正在使用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 – 如何使角色正确?