SQL Server 如何将Unicode select从Java传递到数据库

wj8zmpe1  于 2022-12-17  发布在  Java
关注(0)|答案(1)|浏览(71)

我正在开发一个多语言的字典Java Web应用程序。我使用的数据库是SQL Server 2019。这次的操作是当用户通过日语字符搜索日语单词时,从数据库返回该单词(平假名、片假名、日本汉字,如果你熟悉的话)或罗马字母(字母像a,B,c,我们习惯于在英语中)。当我在SQL Server中执行此查询时,它工作得很好:
Select j.Word, j.Romaaji, p.PoS, d.[Definition], d.Example from Japanese j join (DefinitionsJP d join PartOfSpeech p on d.PoSID = p.PoSID ) on j.WordID = d.WordID where j.Word = N'ano' or j.Romaaji = 'ano'
结果是:

然而,当我将这个查询应用于Java时,它似乎不起作用(即不向list返回任何内容)

public ArrayList<Word> getWordJP(String searchStr) {
        ArrayList<Word> list = new ArrayList<Word>();
        try {
            String strSelect = "Select j.Word, j.Romaaji, p.PoS, d.[Definition], d.Example from Japanese j \n"
                    + "join (DefinitionsJP d join PartOfSpeech p on d.PoSID = p.PoSID ) \n"
                    + "on j.WordID = d.WordID where j.Word = N? or j.Romaaji = ?";
            stm = cnn.prepareStatement(strSelect);
            stm.setString(1, searchStr);
            stm.setString(2, searchStr);
            rs = stm.executeQuery();
            while (rs.next()) {
                Word w = new Word();
                w.word = rs.getString("Word");
                w.romaaji = rs.getString("Romaaji");
                w.PartOfSpeech = rs.getString("PoS");
                w.Definition = rs.getString("Definition");
                w.Example = rs.getString("Example");
                list.add(w);
            }
        } catch (Exception e) {
            System.out.println("getWordJP fail:" + e.getMessage());
        }
        return list;
    }

我相信j.Word = N?是导致我出现问题的部分,因为当我尝试删除它时,查询又正常工作了。至于为什么会有'N',那么,在SQL Server中,当您尝试选择一个Unicode记录时,如日语或汉语字符,您需要在选择字符串前添加一个N,如N'',以便它工作。

50few1ms

50few1ms1#

嗯,我终于想明白了。我想删除这篇文章,但其他人可能会陷入同样的问题,所以我决定不这样做。所以这里是你如何做到这一点。
只需从查询中删除“N”,如下所示:

where j.Word = ?

另外,对setString语句进行以下调整:

stm.setString(1, "N" + searchStr);

瞧,应该就是这样了。谢谢你阅读我的问题。

相关问题