Sqlserver:使用jdbc驱动程序执行sql和使用sql客户端执行有什么区别

时间:2016-03-18 07:05:08

标签: java sql-server jdbc collation

我有一个名为“T_ROLE”的表,它只有一个名为“NAME”的列,其类型为nvarchar(255),sqlserver Collat​​ion为“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()方法,但可以保存成功,为什么?

1 个答案:

答案 0 :(得分:2)

请参阅此博客:https://blogs.msdn.microsoft.com/sqlcat/2010/04/05/character-data-type-conversion-when-using-sql-server-jdbc-drivers/

  

事实证明, JDBC驱动程序默认将包含varchar()的字符数据发送为nvarchar()。原因是最小化Java的本机字符串类型(即Unicode)的客户端转换。

     

那么如何强制JDBC驱动程序不以这种方式运行?有一个名为PseudoColor的连接字符串属性。默认情况下这是真的。

     

有人会问,如果我想同时传递varchar和nvarchar参数怎么办?好吧,即使将connection属性设置为false,也可以显式指定nvarchar类型,如下所示:

sendStringParametersAsUnicode

pStmt.setObject(2,Id,Types.NVARCHAR); //Java app code 的简单Google search找到了这个答案。