gpt4 book ai didi

java - 让 Hibernate 和 SQL Server 更好地处理 VARCHAR 和 NVARCHAR

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:54 24 4
gpt4 key购买 nike


我目前正在一个大型数据库的某些表中启用 UTF-8 字符。这些表已经是 MS-SQL 类型 NVARCHAR。此外,我还有几个使用 VARCHAR 的字段。

Hibernate 与 JDBC 驱动程序的交互存在一个众所周知的问题(参见例如 Mapping to varchar and nvarchar in hibernate)。简而言之,Hibernate/JDBC 生成的 SQL 将所有字符串作为 Unicode 传递,而不管底层 SQL 类型如何。当数据库中的非 unicode (varchar) 字段与 Unicode 输入字符串进行比较时,该列的索引与编码不匹配,因此执行全表扫描。在 JDBC 驱动程序(JTDS 和 MS 版本)中有一个参数将 Unicode 字符串作为 ASCII 传递,但这是一个全有或全无的命题,它不允许将国际字符输入到数据库中。

我在这个问题上看到的大多数帖子都提出了两种解决方案之一 - 1) 将数据库中的所有内容更改为 NVARCHAR 或 2) 设置 sendStringParametersAsUnicode=false,那么我的问题是 - 是否有任何已知的解决方案可以让 VARCHAR 和 NVARCHAR 一起很好地发挥作用?由于下游依赖性和其他外部问题,将所有内容更改为 NVARCHAR 对于我的环境来说是一个巨大问题。

最佳答案

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() );    }}

关于java - 让 Hibernate 和 SQL Server 更好地处理 VARCHAR 和 NVARCHAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5237280/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com