我使用 JPA (Hibernate) 和 jTDS 作为我的 jdbc 驱动程序。每当我的实体列的数据类型是字符串时,创建的准备好的语句varchar(8000)
就用作其参数。例如,我已经尝试@Column(length=50)
在我的映射中使用它,但它似乎被忽略了。
如果我sendStringParametersAsUnicode
在 jTDS 连接中设置,它会nvarchar(4000)
改为使用,但从不尊重我在实体中定义的长度。这有什么原因吗?
我意识到这是一个老问题,但最近我自己遇到了这个问题,我想我会有所启发。
这似乎是jtds
驱动程序故意的。
如果您查看TdsData.java
,您将在此代码块中看到这种情况:
} else {
if (pi.isUnicode && len <= MS_LONGVAR_MAX / 2) {
pi.tdsType = XSYBNVARCHAR;
pi.sqlType = "nvarchar(4000)";
} else if (!pi.isUnicode && len <= MS_LONGVAR_MAX) {
CharsetInfo csi = connection.getCharsetInfo();
try {
if (len > 0 && csi.isWideChars() &&
pi.getBytes(csi.getCharset()).length > MS_LONGVAR_MAX) {
pi.tdsType = SYBTEXT;
pi.sqlType = "text";
} else {
pi.tdsType = XSYBVARCHAR;
pi.sqlType = "varchar(8000)";
}