2 qq 24756229 qq_24756229 于 2016.09.18 10:15 提问

jdbc连接MySQL数据库查询中文数据查询不出来,数据库无乱码现象。 20C

public List queryByNiC2(String nickName){
List list=new ArrayList();

    try {
        conn=DbManager.getConn();
        String sql="select * from snsuserinfo where nickName like "+"'%"+nickName+"%'";
        ps=conn.prepareStatement(sql);
        System.out.println(sql);
        rs=ps.executeQuery();
        System.out.println(rs.getRow()+"rs的长度");
        while(rs.next()){
            SNSUserInfo sns=new SNSUserInfo();
            sns.setId(rs.getInt("id"));
            sns.setOpenId(rs.getString("openId"));
            sns.setNickName(rs.getString("nickName"));
            sns.setCity(rs.getString("city"));
            sns.setHeadImgUrl(rs.getString("headImgUrl"));
            sns.setSex(rs.getInt("sex"));
            sns.setAttentionTime(rs.getString("attentionTime"));
            sns.setAuthNum(rs.getInt("authNum"));
            list.add(sns);
        }


    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return list;


}

7个回答

of214
of214   2016.09.18 12:55

拼接SQL会有SQL注入问题
模糊查询这样写试一下
conn=DbManager.getConn();

    String sql="select * from snsuserinfo where nickName like "+"'%"+nickName+"%'";

    ps=conn.prepareStatement(sql);

            改成

            conn=DbManager.getConn();

    String sql="select * from snsuserinfo where nickName like  ?";

    ps=conn.prepareStatement(sql);

            ps.setString(1, "'%"+nickName+"%'");

可以看下这篇文章 http://58coding.com/article/detail/24615460515348831

XiaoXiao_RenHe
XiaoXiao_RenHe   2016.09.18 10:25

你在mysql中查询有结果吗?
select * from snsuserinfo where nickName like "%王五%";

Marksinoberg
Marksinoberg   Ds   Rxr 2016.09.18 10:27
 这跟数据库有关,如果是像MySQL,d like '%date%'是能完成模糊查询的功能,但像oracle的数据库,这样的语句就未必能完成,不过你可以试着to_char函数来实现类似的功 能:to_char(date, 'yyyy-MM-dd') like '2010-07-06',也可以通过to_date函数来实现搜索: date like to_date('2010-7-6','yyyy-MM-dd')
yicp123
yicp123   2016.09.18 11:33

mysql字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级

你查下你各级别字符集跟校对规则,修改成你需要的字符集及校对规则就可以了。

参考自:
MySQL的字符集和校对 http://www.data.5helpyou.com/article332.html

feihn
feihn   2016.09.18 14:36

MySQL修改成UTF8字符集试试看

u012930316
u012930316   2016.09.18 17:32

这个我曾经遇到过..你这个情况是不是 nickName 不是中文就可以查到????如果是的话那就是mysql的问题,我们当时是重新装了个mysql就解决了,当然,如果你不想重新装mysql的话,你这sql可以转下16进制,
附代码

public static String str2HexStr(String str) throws UnsupportedEncodingException {
        if (str==null) {
            return "";
        }
        char[] chars = "0123456789ABCDEF".toCharArray();
        StringBuilder sb = new StringBuilder("");

        byte[] bs = str.getBytes("utf-8");
        int bit;

        for (int i = 0; i < bs.length; i++) {
          bit = (bs[i] & 0x0f0) >> 4;
          sb.append(chars[bit]);
          bit = bs[i] & 0x0f;
          sb.append(chars[bit]);
        }
        return sb.toString().trim();
}

在java中调用

 String sql="select * from snsuserinfo where HEX(nickName) like "+"'%"+str2HexStr(nickName)+"%'";

 这样就可以查出来了.
 可以的话采纳下.不明白可以追问.
xubo_ob
xubo_ob   2016.09.18 18:05

建议排查方法 :

1、将后面的like什么都去掉,直接select * 看查询出来的中文是否OK

2、如果OK就把参数nickName转为UTF-8试试,看是否OK 。 new String(nickName.getBytes(),"utf-8");

3、如果第二步不OK就直接把SQL拿到cmd或者客户端进行查询

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!