为什么 JPA、Hibernate 和 jTDS 总是使用 varchar(8000) 作为字符串列?

发布于 2024-08-22 23:25:29 字数 289 浏览 8 评论 0原文

我使用 JPA (Hibernate) 和 jTDS 作为我的 jdbc 驱动程序。每当我的实体列的数据类型为 String 时,创建的准备语句都会使用 varchar(8000) 作为其参数。例如,我已经尝试在映射中使用 @Column(length=50) ,但它似乎被忽略了。

如果我在 jTDS 连接中设置 sendStringParametersAsUnicode,它会使用 nvarchar(4000) 代替,但从不尊重我在实体中定义的长度。这是有原因的吗?

I'm using JPA (Hibernate) and jTDS as my jdbc driver. Whenever the datatype of my entity columns are String, the created prepared statement uses varchar(8000) as its parameter. I've already tried to use @Column(length=50) in my mappings for example, but it seems to be ignored.

If I set sendStringParametersAsUnicode in jTDS connection, it uses nvarchar(4000) instead, but never respects the lentghs I define in my entities. Is there a reason for that?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

二智少女 2024-08-29 23:25:29

我意识到这是一个老问题,但最近我自己也遇到了这个问题,我想我可以解释一下。

这似乎是 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)";
            }

I realize this is an old question, but having recently run into this myself I thought I'd shed some light.

This seems to be intentional in the jtds driver.

If you look at TdsData.java, you will see this occur in this code-block:

} 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)";
            }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文