【问题标题】:Handling NVARCHAR columns with MS SQL Server and Hibernate使用 MS SQL Server 和 Hibernate 处理 NVARCHAR 列
【发布时间】:2011-04-04 06:05:48
【问题描述】:

我有一个使用 MS SQL Server 2005 作为 DBMS 和 jTDS 作为 JDBC 驱动程序的应用程序。所有存储文本的列都是 VARCHAR 类型。为驱动程序指定了sendStringParametersAsUnicode=false 参数,以防止它以 unicode 形式发送所有字符串(这将导致索引扫描而不是索引列的索引查找,从而严重损害性能)。

现在我需要在数据库中存储 Unicode 文本。我的问题是,如果我只是将列类型更改为 NVARCHAR,Hibernate 仍然会向 DB 发送一个非 Unicode 字符串(没有 N 前缀),并且由于上述参数,驱动程序不会将其更改为 Unicode。显而易见的解决方案是将所有文本列更改为 NVARCHAR 并删除参数。但是,我有近 100 个文本列,因此一次更改所有文本非常困难,我想逐列进行更改。此外,有些列理想情况下应该保留 CHAR 或 VARCHAR,因为永远不会向它们写入 Unicode 文本。

那么,有没有一种方法可以告诉 Hibernate 发送带有 N 前缀的某些列的值,而不会影响仍在使用 VARCHAR 的其他列?据我了解,这应该可以解决问题。或者如果您能提出一些其他方法来处理这个问题,我们也将不胜感激。

编辑:最后,我选择将所有文本列更改为 NCHAR 或 NVARCHAR。有趣的是,数据库的大小增长到原来大小的两倍多。我不知道这怎么可能,但我想我必须忍受它。

【问题讨论】:

  • carlos,这可能是使用错误的协议来启动这样一个旧线程,但我正在处理使用 Java 前端和休眠的 UTF-8 的 sql 服务器。解决问题所需要做的就是更改列类型吗?您是否需要如上所述更改驱动程序/驱动程序配置?感谢您的帮助
  • @akaphenom 我不得不删除 sendStringParametersAsUnicode 参数,但仅此而已。

标签: sql-server hibernate unicode


【解决方案1】:

我可以回答尺寸问题...

  • nvarchar 占用的空间是 varchar 的两倍
  • 这也反映在任何索引中
  • 您可以减少每页的行数,从而降低页面密度。

It all adds up.

我也会考虑使用 JTDS 而不是 MS JDBC...我认为这要好得多

【讨论】:

  • 我想这可以解释,谢谢。但就像我说的那样,我一直在使用 JTDS。从未听说过有关 MS 实施的任何好消息。
猜你喜欢
  • 2013-06-08
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-18
  • 2019-05-08
  • 2021-08-31
相关资源
最近更新 更多