【问题标题】:SQL Server 2008 convert varchar to varbinarySQL Server 2008 将 varchar 转换为 varbinary
【发布时间】:2014-08-18 12:41:37
【问题描述】:

我尝试使用如下代码将图像数据导入 sql server 2008 db:

INSERT INTO [TAB] (ID_PHOTO,PHOTO)
VALUES(
    CAST('333EFB54-7062-E043-F088-FE0A916C0297' as uniqueidentifier),
    CONVERT(varbinary(max),'0xFFD8FFE000')
)

字符串只是一个虚拟字符串,但是当我进行插入时,我在数据库中发现了类似的内容

0x307846464438464645303030

这不是我所期望的。有人知道我做错了什么吗?

【问题讨论】:

  • 问题是:你期待什么?
  • varbinary 的最大大小为8000,它可能不包含整个图像,您应该改用image 数据类型(最多可容纳2,147,483,647 字节。还可以节省大量不建议使用数据库中的图像数据,我们可以保存 URL(并确保 URL 是某种永久链接)。
  • @glaeran;回答你问题的人必须得到 +rep

标签: sql-server type-conversion varbinary


【解决方案1】:

这里的问题只是一个字符串——'0xFFD8FFE000'——被转换为VARBINARY,所以每个字符——首先是0,然后是x,然后是F,等等-- 被“转换”为它的十六进制表示:

Character   --  Hex value
  0               30
  x               78
  F               46
  F               46
  D               44
  8               38
  F               46
  F               46
  E               45
  0               30
  0               30
  0               30

因此,0xFFD8FFE000 被视为只是一个字符串,就像“这是一个测试”一样,而不是一个字节序列。

幸运的是,修复非常简单:只需将可选的第三个参数的“样式”值1 添加到CONVERT

SELECT CONVERT(VARBINARY(MAX), '0xFFD8FFE000', 1);
-- 0xFFD8FFE000

【讨论】:

    【解决方案2】:

    你看到的是正确的。您应该能够运行以下命令来查看它们的转换是否正确(基本上,将数据库中的 varbinary 值转换回 VARCHAR):

    SELECT CONVERT(varbinary(max),'0xFFD8FFE000')
    SELECT CONVERT(varchar(100), 0x307846464438464645303030)
    

    SELECT CONVERT(varchar(100), CONVERT(varbinary(max),'0xFFD8FFE000'))
    

    请注意 varbinary 值周围缺少单引号 - SQL Server 中不需要

    【讨论】:

    • 嗯,有趣。问题是我正在入侵一个现有的应用程序,而所有其他图像都以开头
    • 存储的数据是什么样的,数据类型是什么?你有例子吗?
    【解决方案3】:

    我想用 pic 将数据插入到 sql DB 中,为此我已将 sql 中的数据类型设置为 varbinary,但出现以下错误

    System.Data.SqlClient.SqlException: '从数据隐式转换 不允许将 varchar 类型转换为 varbinary(max)。

    使用 CONVERT 函数运行此查询。' 考虑我的代码:

     private void InsertButton_Click(object sender, EventArgs e)
        {
            string grno = GRNoTextBox.Text;
            string rollno = RollNoTextBox.Text;
            string name = NameTextBox.Text;
            string fname = FatherNameTextBox.Text;
            string cno = ContactNoTextBox.Text;
            string clas = ClassComboBox.SelectedItem.ToString();
            string sec = SectionComboBox.SelectedItem.ToString();
            string picadd = ofg.FileName;
    
            conn.Open();
            string query = "insert into stdinfo values ('"+grno+ "','" + rollno + "','" + name + "','" + fname + "','" + clas + "','" + sec + "','" + cno + "','" + picadd + "')";
            SqlCommand cmd = new SqlCommand(query, conn);
            cmd.ExecuteNonQuery();
            conn.Close();
    
            MessageBox.Show("Student info inserted into database successfully");
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 1970-01-01
      • 2013-12-28
      • 1970-01-01
      • 2013-05-08
      • 1970-01-01
      相关资源
      最近更新 更多