当前位置: 首页 > 知识库问答 >
问题:

Hibernate VARCHAR和NVARCHAR转换错误

楚浩然
2023-03-14

Microsoft SQL Server,数据库中的列定义为NVARCHAR,但在Java代码中定义为@column(name=“column_name”,columnDefinition=“varchar”)

Hibernate失败,验证错误如下:

原因:org.hibernate.tool.schema.spi.schemaManagementException:模式验证:在表[Table_Name]中的列[Column_Name]中遇到错误的列类型;找到[nvarchar(types#nvarchar)],但在org.hibernate.tool.schema.internal.schemavalidatorimpl.validateColumntype(Schemavalidatorimpl.java:105)~[hibernate-core-5.0.12.final.jar:5.0.12.final.jar:5.0.12.final]

这并不奇怪,但是相反的方式(database VARCHAR,code NVARCHAR)确实没有错误。

这听起来不合逻辑,我认为在数据库中使用NVARCHAR的代码中的VARCHAR定义可以工作,因为没有预期的Unicode数据丢失,而在数据库中使用VARCHAR的代码中的NVARCHAR应该是验证错误,因为这样可能会有Unicode数据丢失。

如此奇怪的验证行为有原因吗?

共有1个答案

山鸿彩
2023-03-14
public class SQLServerUnicodeDialect extends org.hibernate.dialect.SQLServerDialect {
    public SQLServerUnicodeDialect() {
        super();
        registerColumnType(Types.CHAR, "nchar(1)");
        registerColumnType(Types.LONGVARCHAR, "nvarchar(max)" );
        registerColumnType(Types.VARCHAR, 4000, "nvarchar($l)");
        registerColumnType(Types.VARCHAR, "nvarchar(max)");
        registerColumnType(Types.CLOB, "nvarchar(max)" );

        registerColumnType(Types.NCHAR, "nchar(1)");
        registerColumnType(Types.LONGNVARCHAR, "nvarchar(max)");
        registerColumnType(Types.NVARCHAR, 4000, "nvarchar($l)");
        registerColumnType(Types.NVARCHAR, "nvarchar(max)");
        registerColumnType(Types.NCLOB, "nvarchar(max)");

        registerHibernateType(Types.NCHAR, StandardBasicTypes.CHARACTER.getName());
        registerHibernateType(Types.LONGNVARCHAR, StandardBasicTypes.TEXT.getName());
        registerHibernateType(Types.NVARCHAR, StandardBasicTypes.STRING.getName());
        registerHibernateType(Types.NCLOB, StandardBasicTypes.CLOB.getName() );
    }
}

尝试以下代码,在registerColumnType中放置paramter types.nvarchar

 类似资料:
  • 问题内容: 我已经在动态SQL中创建了一个过程,该过程具有一个select语句,并且代码如下所示: 当我使用以下语句执行此过程时: 我收到以下错误。 消息245,级别16,状态1,procedurecagroup,第33行将nvarchar值’SELECT [Gro] AS GName,’转换为数据类型int时,转换失败。 我在哪里做错了? 问题答案: 您需要在串联中将所有数字CAST转换为nva

  • 问题内容: 我已经搜索了这个很棒的论坛并在Google周围搜索,但无法解决。 我们有两个表(相信我,我与这些表无关)。这两个表都有一个名为的列。 然而,在一个表中,数据类型就是和在另一个表中,这是。 我们从选择这里被定义为和保存该ID写入其中被定义为。 作为数据类型descrepancy的结果,我们得到错误转换数据类型来。 在不弄乱数据库的情况下,我想强制使用摆脱该错误。 有什么想法我在下面的代码

  • 问题内容: 我在代码隐藏中收到转换失败的错误。我的代码如下: 我收到以下错误: 将nvarchar值转换为数据类型int时,转换失败。 在这里必须进行哪些更改? 问题答案: 我想这是一个整数,但您正在分配一个字符串。因此,这可能会解决它: 编辑:由于您已评论该会话存储了用户名,但该列是一个int列,因此您有三个选择: 更改会话以存储用户标识而不是名称 更改列以存储用户名 从存储用户名的表中选择用户

  • 问题内容: 我想将一个表的所有行插入另一个表,并且还希望将一个字段转换为,但是当我使用SQL Server时显示错误: 将数据类型nvarchar转换为bigint时出错 我该如何解决这个问题? 问题答案: 您可以尝试使用以确定确实是数字的那些行: 那将转换那些可以转换的行-其他行需要手动处理。

  • 我在IIS上成功安装了Laravel。我也成功地用laravel连接了MSSQL数据库。我运行artisan命令< code>php artisan make:auth和< code>php artisan migrate。制作一个登录/注册页面。现在,当我注册一个新用户时,我得到一个错误。: SQLSTATE[22007]:[Microsoft][ODBC驱动程序17 forSQLServer]

  • 具有值的表 在存储过程中,我想从表中选择值,然后将其转换为var二进制最大值。我选择: 但是我得到一个错误: 不允许从数据类型varchar隐式转换为var二进制(max)。使用CONVERT函数运行此查询。 请帮我解决这个问题