它只nvarchar支持多字节字符吗?如果是这种情况,除了存储问题之外,还有什么意义varchars吗?
我试图理解Java中的字符编码.Java中的字符使用UTF-16编码以16位存储.因此,当我将包含6个字符的字符串转换为字节时,我得到6个字节,如下所示,我期待它为12.是否有任何概念我缺少?
package learn.java;
public class CharacterTest {
public static void main(String[] args) {
String str = "Hadoop";
byte bt[] = str.getBytes();
System.out.println("the length of character array is " + bt.length);
}
}
Run Code Online (Sandbox Code Playgroud)
O/p:字符数组的长度为6
根据@Darshan当尝试使用UTF-16编码来获取字节时,结果也没有预料到.
package learn.java;
public class CharacterTest {
public static void main(String[] args) {
String str = "Hadoop";
try{
byte bt[] = str.getBytes("UTF-16");
System.out.println("the length of character array is " + bt.length);
}
catch(Exception e)
{
}
}
}
o/p: the length of character array is 14
Run Code Online (Sandbox Code Playgroud) 我在SQL Server 2008 R2中有一个包含两个字段(WordHash,Word)的表.Hash在C#中生成此字段,我需要为Wordsql server中的字段重新生成哈希码.
但我的问题是在sql server和C#中生成的MD5哈希是不同的.我发现下面的代码来解决这个问题,但我仍然遇到同样的问题.
SQL代码:
CONVERT(NVARCHAR(32),HASHBYTES('MD5', 'some word'), 2)
Run Code Online (Sandbox Code Playgroud)
将此代码块放入查询后,我看到了一些有线结果!这是我的结果:
我的查询:
SELECT
[WordHash],
convert(nvarchar(32),HASHBYTES('MD5', 'Analytics'),2) AS TestHash,
convert(nvarchar(32),HASHBYTES('MD5', [Word]),2) AS SqlHash
FROM myTable
Run Code Online (Sandbox Code Playgroud)
结果:
WordHash: A768CAA988605A2846599CF7E2D0C26A
TestHash: A768CAA988605A2846599CF7E2D0C26A
SqlHash F4AFA5FEF805F7F5163EC6402BAF61FF
Run Code Online (Sandbox Code Playgroud)
请注意,它'Analytics'是数据库中的记录数据之一.
为什么TestHash&SqlHash虽然他们来自同一个代码生成是不同的!?
我正在尝试将 HASHBYTES 与 MD5 算法一起使用。但是根据数据的传递方式得到不同的结果,即,
如果使用变量传递SELECT HASHBYTES('MD5', @Var)显示结果 0xBEC062C01D70F0D2FC15F2E43EE3A66B
如果通过直接SELECT HASHBYTES('MD5', 'asd123')显示结果 0xBFD59291E825B5F2BBF1EB76569F8FE7
我使用 INSERT 插入了数据,但是当我尝试使用我的 STORED PROCEDURE 进行检索时,没有显示任何记录。
有什么我想念的吗?
我编写了以下SQL CLR函数,以便散列大于8000字节的字符串值(T-SQL内置HASHBYTES函数的输入值的限制):
[SqlFunction(DataAccess = DataAccessKind.None, IsDeterministic = true)]
public static SqlBinary HashBytes(SqlString algorithm, SqlString value)
{
HashAlgorithm algorithmType = HashAlgorithm.Create(algorithm.Value);
if (algorithmType == null || value.IsNull)
{
return new SqlBinary();
}
else
{
byte[] bytes = Encoding.UTF8.GetBytes(value.Value);
return new SqlBinary(algorithmType.ComputeHash(bytes));
}
}
Run Code Online (Sandbox Code Playgroud)
它适用于拉丁字符串.例如,以下哈希值是相同的:
SELECT dbo.fn_Utils_GetHashBytes ('MD5', 'test'); -- 0x098F6BCD4621D373CADE4E832627B4F6
SELECT HASHBYTES ('MD5', 'test'); -- 0x098F6BCD4621D373CADE4E832627B4F6
Run Code Online (Sandbox Code Playgroud)
问题是它不适用于西里尔字符串.例如:
SELECT dbo.fn_Utils_GetHashBytes ('MD5 ', N'???????? ?? ????????') -- NULL
SELECT HashBytes ('MD5 ',N'???????? ?? ????????') -- 0x838B1B625A6074B2BE55CDB7FCEA2832
SELECT …Run Code Online (Sandbox Code Playgroud) 我有一个SQL表,我在其中存储必须唯一的大字符串值.为了确保唯一性,我在列上有一个唯一索引,我在其中存储大字符串的MD5哈希的字符串表示.
保存这些记录的C#应用程序使用以下方法进行散列:
public static string CreateMd5HashString(byte[] input)
{
var hashBytes = MD5.Create().ComputeHash(input);
return string.Join("", hashBytes.Select(b => b.ToString("X")));
}
Run Code Online (Sandbox Code Playgroud)
为了调用此,我首先转换string到byte[]使用UTF-8编码:
// this is what I use in my app
CreateMd5HashString(Encoding.UTF8.GetBytes("abc"))
// result: 90150983CD24FB0D6963F7D28E17F72
Run Code Online (Sandbox Code Playgroud)
现在我希望能够在SQL中使用该HASHBYTES函数实现这个散列函数,但是我得到了一个不同的值:
print hashbytes('md5', N'abc')
-- result: 0xCE1473CF80C6B3FDA8E3DFC006ADC315
Run Code Online (Sandbox Code Playgroud)
这是因为SQL计算字符串的UTF-16表示的MD5.如果我这样做,我会在C#中获得相同的结果CreateMd5HashString(Encoding.Unicode.GetBytes("abc")).
我无法改变在应用程序中完成散列的方式.
有没有办法让SQL Server计算字符串的UTF-8字节的MD5哈希值?
我查了类似的问题,我尝试使用整理,但到目前为止没有运气.