【问题标题】:Inserting a string with any ASCII char (0 to 255) into a VARCHAR field in SQL Server将带有任何 ASCII 字符(0 到 255)的字符串插入 SQL Server 中的 VARCHAR 字段
【发布时间】:2012-07-09 22:59:18
【问题描述】:

我对 SQL Server 比较陌生,并且正在使用 Visual Basic 6 开发旧版应用程序。如何使用 SQL INSERT 命令将可以包含 0 到 255 之间的任何 ASCII 字符的字符串插入到 VARCHAR 字段中?

【问题讨论】:

  • 使列 VarBinary 并作为字节数组参数传入您的字节。示例:stackoverflow.com/questions/2307830/…
  • +1 Alex K。随机的字节序列不是字符串,不应被视为字符串。
  • 感谢字节数组的建议,但我还需要将文本存储在该表中其他记录的同一字段中。我最终通过更改加密例程以防止使用 Chr(0) 和单引号字符 (') 解决了这个问题,然后我可以将生成的加密字符串存储在 VARCHAR 字段中。

标签: sql-server vb6


【解决方案1】:

您可以将字符串编码为表示字符串字符的 ASCII 代码的十六进制值序列,将 0x 放在序列前面,然后将 CAST(… AS varchar(<i>n</i>)) 应用于整个事物并在 DDL 语句中使用该表达式.

我的意思是,如果你的字符串是例如#X?!v,你可以这样插入

UPDATE table
SET column = CAST(0x23583F2176 AS varchar(n))
WHERE condition

因此,如果某处存在 NUL 字符,则生成的序列将在相应位置包含 00

我并没有真正“说”VB,但如果我这样做了,我可能会考虑创建一个接受原始字符串并返回十六进制代码字符串的函数,因此,在构建 DDL 命令时,我的 VB 指令可能看起来像这样:

cmd.CommandText = "UPDATE table SET column = CAST(0x" & HexEncode(RawString) & " AS varchar(n)) WHERE condition"

【讨论】:

    【解决方案2】:

    假设您的项目引用了 ADO,它是这样的:

    Dim oConn As Connection
    Dim oCmd As Command
    
    Set oConn = New Connection
    
    oConn.Open <your connection string goes here>
    
    Set oCmd = New Command
    
    oCmd.ActiveConnection = oConn
    oCmd.CommandText = "INSERT INTO TableName (ColumnName) VALUES('string')"
    oCmd.Execute
    

    【讨论】:

    • 这就是我正在使用的命令,但是,一旦它遇到嵌入在字符串中的 chr(0),它就会抛出这个错误:“字符串后面的未闭合引号”。有没有办法让它接受 0 到 255(含)之间的任何字符?
    • 我刚刚做了一点研究。似乎 chr(0) 被视为命令的结尾。因此,它会在某个时候终止您的字符串。这解释了错误消息。如果不将数据视为二进制并将列更改为 VARBINARY,恐怕我不知道如何解决这个问题。
    • 感谢您的意见。我正在尝试将以前加密的数据存储到该字段中。我将尝试将列转换为 VARBINARY。我仍然不确定如何将其放入 INSERT 命令中。例如:这是对的吗? CONVERT(VARBINARY(256),'^%$76546%$#%^#@$@!*&'^%&^') 如果字符串可以包含任何字符,你如何分隔?
    【解决方案3】:

    我手头没有 ADO 参数语法,但您应该能够使用 ADO 参数将一般字符串(包括 NUL)插入到 varchar 列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2010-09-07
      • 1970-01-01
      • 2016-08-05
      • 2018-11-09
      相关资源
      最近更新 更多