您的位置:首页 > 数据库 > MySQL

windws下mysql客户端登陆服务器选用字符集的不同造成的语句执行效果不正确

2009-05-23 22:39 429 查看
项目中涉及到了对中文的模糊查询,即对中文的匹配问题。该过程通过在系统中调用服务器端的存储过程来实现。将中文作为参数传入存储过程,模糊查询后,返回匹配结果。但是却总也无法返回结果。无奈,又是一上午搭进去了,好在,问题解决了。

下面说说这个问题,不仅仅是对这个问题,它是很多类似问题的典型代表,有很大的指定意义:说道底,这个问题是字符集编码的问题!!!

我的机器上装有mysql客户端,操作系统式windows xp;服务器上装有mysql服务器,操作系统是red hat Enterprise linux 5;

我在我的电脑的文本编辑器中写好存储过程脚本,然后,在cmd里面登录mysql服务器,执行存储过程的脚本,创建好存储过程。然后在我本地通过java应用程序调用存储过程,传进中文参数,得到返回结果,本该得到记录,但输出为空。而当我传入的参数是英文字符时却可以得到预期的结果集。

多余的就不说了,直接解释原因吧:

windows xp中的cmd是默认的GBK编码,那么我从这个平台下登录到linux服务器后,创建的存储过程全都是GBK编码的,包括我的存储过程中SQL脚本中的用于匹配中文的那个?参数(我是采用了预编译SQL的方式);既然这个问号是GBK编码的,它要去匹配的话就会找一个GBK的字符去匹配,而JAVA是UTF8编码的,当我从JAVA应用程序里传一个汉字进去,加入时"中",这个"中"就是UTF8编码的,它被传进存储过程后,存储过程会把这个字当成GBK编码的字去匹配,也就是指截取了这个UTF8编码的"中"的一个字节去匹配数据库中的记录,自然,没有匹配上的结果了。

问题明朗了,如何把存储过程中的字符以UTF8编码进行编译??

这里有几个解决的方式:

1:在LINUX服务器里面的终端里登录mysql服务器,创建该存储过程,由于LINUX默认的是UTF8编码,自然就会把存储过程创建为UTF8编码。

2:在windows xp的cmd中,登录mysql服务器的时候,指定字符集:mysql -h192.168.0.2 -uroot -ppswd --default-characer-set=utf8即可,这样,客户端与服务器之间就是通过统一的utf8编码进行通信了。

至此,问题解决。

这个问题也同样适用于对中文的导入导出:比如select * from table into outfile 'filepath'语句,若记录中存在中文,也需要用这种方式解决,同样导入也是。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐