相关疑难解决方法(0)

varchar和nvarchar有什么区别?

它只nvarchar支持多字节字符吗?如果是这种情况,除了存储问题之外,还有什么意义varchars吗?

sql-server varchar nvarchar

1300
推荐指数
19
解决办法
101万
查看次数

java的UTF-16字符编码

我试图理解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)

java character-encoding

13
推荐指数
1
解决办法
3万
查看次数

为什么在sql server中生成MD5哈希不相等?

我在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虽然他们来自同一个代码生成是不同的!?

c# sql-server hash md5

12
推荐指数
1
解决办法
1万
查看次数

在 SQL Server 中获取 HASHBYTES() 方法的不同结果

我正在尝试将 HASHBYTES 与 MD5 算法一起使用。但是根据数据的传递方式得到不同的结果,即,

  1. 如果使用变量传递SELECT HASHBYTES('MD5', @Var)显示结果 0xBEC062C01D70F0D2FC15F2E43EE3A66B

  2. 如果通过直接SELECT HASHBYTES('MD5', 'asd123')显示结果 0xBFD59291E825B5F2BBF1EB76569F8FE7

我使用 INSERT 插入了数据,但是当我尝试使用我的 STORED PROCEDURE 进行检索时,没有显示任何记录。

有什么我想念的吗?

database sql-server hash character-encoding

5
推荐指数
1
解决办法
1343
查看次数

基于.net ComputeHash的SQL CLR功能不适用于Cyrrilic

我编写了以下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)

.net c# t-sql hash sqlclr

5
推荐指数
1
解决办法
496
查看次数

计算UTF8字符串的MD5哈希值

我有一个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)

为了调用此,我首先转换stringbyte[]使用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哈希值?

我查了类似的问题,我尝试使用整理,但到目前为止没有运气.

t-sql sql-server hash encoding sql-server-2008-r2

4
推荐指数
1
解决办法
3685
查看次数