将SQL Server Varbinary数据类型解码为Java字符串
试图绕过Java中的Jboss Hibernate问题,在该问题中,您无法从存储过程处理Nvarchar SQL Server数据类型。我无法将数据类型转换或强制转换为varchar,因为我们存储多字节字符,因此,数据类型是必须的。但是,我能够在存储过程中将类型转换为varbinary,并用Java进行解码 SQL Server进程:将SQL Server Varbinary数据类型解码为Java字符串,java,sql-server,hibernate,varbinary,Java,Sql Server,Hibernate,Varbinary,试图绕过Java中的Jboss Hibernate问题,在该问题中,您无法从存储过程处理Nvarchar SQL Server数据类型。我无法将数据类型转换或强制转换为varchar,因为我们存储多字节字符,因此,数据类型是必须的。但是,我能够在存储过程中将类型转换为varbinary,并用Java进行解码 SQL Server进程: Convert(varbinary, Tile) AS Title 在Java端,我读取结果集和字段,现在编码为 更新为实际编码: 我尝试将此bytearra
Convert(varbinary, Tile) AS Title
在Java端,我读取结果集和字段,现在编码为
更新为实际编码:
我尝试将此bytearray解析为字符串,如下所示:
byte[] bytes = (byte[]) dataField[0];
try {
String varbinaryString = new String(bytes, "UTF-8");
System.out.println(varbinaryString);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
结果几乎是标题字段中的预期解码字符串,只是,它以以下方式解码:
D e s i g n & P l a n n i
而不是直截了当的
Design & Planning Director
在Java解码SQL Server varbinary数据类型时,有人能帮助我解决这个难题吗
提前感谢您的帮助或提示 使用Spring和JPA,我不能像其他人建议的那样扩展Hibernate Sql方言类,不过,如果使用Hibernate cfg,这是一个很好的解决方案。我的思路是正确的,但您必须记住不要将varbinary限制为navarchar的继承长度,即nvarchar(30) 返回整个编码字符串。最后,我试着解码UTF-8,虽然这主要是尝试和错误,但varbinary在UTF-16中编码
s = new String(bytes, "UTF-16LE");
使用Spring和JPA,我无法像其他人建议的那样扩展Hibernate Sql方言类,不过,如果您使用Hibernate cfg,这是一个很好的解决方案。我的思路是正确的,但您必须记住不要将varbinary限制为navarchar的继承长度,即nvarchar(30) 返回整个编码字符串。最后,我试着解码UTF-8,虽然这主要是尝试和错误,但varbinary在UTF-16中编码
s = new String(bytes, "UTF-16LE");
您确定文本以UTF-8编码存储在varbinary字段中吗?如果要将varbinary字段转换为“Tile”,那么“Tile”是什么类型?0x4761626520697320417765736F6D65在UTF-8中对我来说不像“D e s i g n…”。第一个小写字母“e”位于字节索引3处。0x47是大写G,而不是大写D。title字段最初是数据库表上的Nvarchar,但是hibernate不会从存储过程映射Nvarchar数据类型,因此在存储过程中,我将其转换为Varbinary。我发布了一个二进制示例,这是实际的:0x440065007300690067006E00200002600200050006C0061006E006E006900我不确定如何从0x440065开始。。。进入0x476162。。。这些似乎并不平等,即使在转换之后。你不能返回原始的varbinary,然后直接在Java中将其解析为UCS-2/UTF-16吗?我删除了第一个示例varbinary,实际是:Convert(varbinary,Tile)作为标题编码为:0x440065007300690067006E00200002600200050006C0061006E006E006900,当标题为Design&Planning Director.Roger时。在Java中,是否不可能只提取原始varbinary并从UCS-2/UTF-16进行转换?为什么要在数据库中转换,而我仍然不知道“Tile”是什么数据类型-我假设它是用户定义的?您确定文本以UTF-8编码存储在varbinary字段中吗?如果要将varbinary字段转换为“Tile”,那么“Tile”是什么类型?0x4761626520697320417765736F6D65在UTF-8中对我来说不像“D e s i g n…”。第一个小写字母“e”位于字节索引3处。0x47是大写G,而不是大写D。title字段最初是数据库表上的Nvarchar,但是hibernate不会从存储过程映射Nvarchar数据类型,因此在存储过程中,我将其转换为Varbinary。我发布了一个二进制示例,这是实际的:0x440065007300690067006E00200002600200050006C0061006E006E006900我不确定如何从0x440065开始。。。进入0x476162。。。这些似乎并不平等,即使在转换之后。你不能返回原始的varbinary,然后直接在Java中将其解析为UCS-2/UTF-16吗?我删除了第一个示例varbinary,实际是:Convert(varbinary,Tile)作为标题编码为:0x440065007300690067006E00200002600200050006C0061006E006E006900,当标题为Design&Planning Director.Roger时。在Java中,是否不可能只提取原始varbinary并从UCS-2/UTF-16进行转换?为什么要在数据库中转换,而我仍然不知道“Tile”是什么数据类型——我假设它是用户定义的?
s = new String(bytes, "UTF-16LE");