【问题标题】:Function returning string with spaces in between each character, issues when trying to remove spaces函数返回每个字符之间有空格的字符串,尝试删除空格时出现问题
【发布时间】:2012-09-06 16:39:26
【问题描述】:

好的,所以我发现了问题所在,它在 sql 转换函数中。当它应该是 nvarchar(30) 时,我正在转换为 varchar(30)。来看看区别。 What is the difference between varchar and nvarchar?

我想这可能是一个愚蠢的问题,但我似乎无法从该函数返回的字符串中删除某种空格。我想第一个真正的问题是,当我们像这样“1234789”保存到数据库时,为什么这个函数会返回这样的字符串“1 2 3 4 5 6 7 8 9”。第二个问题是为什么会这样

Replace("1 2 3 4 5 6 7 8 9","\p{Zs}","")

Replace("1 2 3 4 5 6 7 8 9"," ","")

不工作,我有一种感觉,因为中间的字符看起来像空格但不是。

    Private Shared Function GetEncryptedPmtField(lhID As Integer, accountId As Integer, fieldName As String)
        Dim openKeyCmd = String.Format("OPEN SYMMETRIC KEY somekey DECRYPTION BY PASSWORD = '{0}'",     ConfigurationManager.AppSettings("Somethingsomething"))
        Const closeKeyCmd As String = "CLOSE SYMMETRIC KEY somekey"

        Dim command As New SqlCommand()
        command.Connection = New SqlConnection(ConfigurationManager.ConnectionStrings("Something").ConnectionString)
        command.CommandType = CommandType.Text
        command.CommandText = String.Format("{0} SELECT convert(varchar(30),decryptbykey({1})  FROM  paymentacct WHERE lh_id = @lhid AND id = @id ; {2}", openKeyCmd, fieldName, closeKeyCmd)
        command.Parameters.AddRange({New SqlParameter With {.ParameterName = "lhid", .Value = lhID}, New SqlParameter With {.ParameterName = "id", .Value = accountId}})
        command.Connection.Open()
        Dim baNum = command.ExecuteScalar().ToString()
        command.Connection.Close()
        Return baNum
    End Function

【问题讨论】:

  • 如果它们不是空格,那么它们是什么?在链接上设置断点,查看十六进制变量的内容。
  • 在字符串的每个字符上调用Char.GetNumericValue();我敢打赌你的数据库包含 NVarChar、UCS-16 或类似的东西,而不是 Unicode。
  • 正如@DourHighArch 所说,你有一些编码问题。不要尝试用正则表达式或替换来解决它。解决您的编码问题。
  • 我有兴趣查看 command.ExecuteScalar() 返回的对象类型。 MSDN 说它返回一个泛型对象,可以找出实际返回的类型,然后更好地理解它的 ToString() 方法。

标签: .net sql vb.net


【解决方案1】:

谢谢大家的帮助,这里是修复。 因此,问题在于我将加密字段转换为的类型。我使用的是 varchar 而不是 nvarchar。

  SELECT convert(varchar(30),decryptbykey(keyname) FROM  paymentacct

 SELECT convert(nvarchar(30),decryptbykey(keyname))  FROM  paymentacct

注意转换函数中的 varchar -> nvarchar 变化

【讨论】:

    【解决方案2】:

    试试正则表达式 \s

    System.Diagnostics.Debug.WriteLine(Regex.Replace("12 3  4   5   ",@"\s+",""));
    

    如果您使用 String.Replace,那么它不会将“\p{Zs}”识别为空格。
    您需要使用正则表达式。该问题未标记正则表达式。

    你是说数据库中的值是正确的吗?

    【讨论】:

    • 虽然这对您提出的示例有效,但在这种情况下无效。 i.imgur.com/qCroz.png
    • 那么你需要发布实际数据。复制粘贴问题数据。很可能这是一个奇怪的空间。
    • 直接从手表|姓名 |价值 |类型| Regex.Replace(GetEncryptedPmtField(28,142,"routing"),"\p{Zs}","") | “1 2 3 4 5 6 7 8 9” |字符串
    • 您评论中的那些空格是常规字符(32)。手表中的内容可能会被格式化。我的意思是复制粘贴更接近实际输出。
    • @BrianRizo 另外,将您的手表设置为以十六进制显示。这应该会有所帮助。
    猜你喜欢
    • 2019-09-05
    • 2013-09-23
    • 2023-01-31
    • 2021-11-16
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多