我有一个名为“T_ROLE”的表,它只有一个名为“NAME”的列,其类型为nvarchar(255),sqlserver Collation为“SQL_Latin1_General_CP1_CI_AS”(en_US),现在我想插入日文字符,所以我知道我需要做这样的SQL:
INSERT INTO T_ROLE(NAME) VALUES(N'japaneseString')
这可以成功。
如果我做sql:
INSERT INTO T_ROLE(NAME) VALUES('japaneseString')
没有N前缀,它将保存为'?',我可以在这些行为下。
但是当我使用sqlserver jdbc驱动程序执行这样的插入操作时:
String sql = "INSERT INTO T_ROLE (NAME) VALUES(?)";
stmt.setString(1, "");
stmt.execute(sql);
注意:我不使用stmt.setNString()方法,但可以保存成功,为什么?
答案 0 :(得分:2)
事实证明, JDBC驱动程序默认将包含varchar()的字符数据发送为nvarchar()。原因是最小化Java的本机字符串类型(即Unicode)的客户端转换。
那么如何强制JDBC驱动程序不以这种方式运行?有一个名为
PseudoColor
的连接字符串属性。默认情况下这是真的。有人会问,如果我想同时传递varchar和nvarchar参数怎么办?好吧,即使将connection属性设置为false,也可以显式指定nvarchar类型,如下所示:
sendStringParametersAsUnicode
pStmt.setObject(2,Id,Types.NVARCHAR); //Java app code
的简单Google search找到了这个答案。