SQL Server 2008 将 varchar 转换为 varbinary

7

我试图使用以下代码将图像数据导入到SQL Server 2008数据库中:

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

这个字符串只是一个虚拟的值,但当我执行插入操作时,我在数据库中发现了类似这样的东西。
0x307846464438464645303030

这不完全是我预期的结果。有人知道我做错了什么吗?


6
问题是:你期望什么? - glaeran
1
varbinary 的最大大小为 8000,可能无法包含整个图像,您应该使用 image 数据类型代替(它可以容纳多达 2,147,483,647 字节)。此外,不建议将大型图像数据保存在数据库中,我们可以保存 URL(并确保这些 URL 是某种永久链接)。 - King King
@glaeran;回答你问题的人必须得到+rep。 - Felipe Pereira
3个回答

6

这里的问题很简单,就是一个字符串 -- '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 被视为字符序列,就像 "this is a test" 一样,而不是字节序列。幸运的是,修复方法非常简单:只需为 CONVERT 的可选第三个参数添加一个 "style" 值为 1 即可。
SELECT CONVERT(VARBINARY(MAX), '0xFFD8FFE000', 1);
-- 0xFFD8FFE000

3

您看到的是正确的。以下内容应该可以运行,以验证转换是否正确(基本上将DB中的varbinary值转换回VARCHAR):

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

或者

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

请注意varbinary值周围没有单引号 - 在SQL Server中不需要。

嗯,有趣。事实是我正在攻击一个现有的应用程序,而所有其他图像都以...开头。 - Thomas Dorloff
存储的数据长什么样子,数据类型是什么?你有例子吗? - How 'bout a Fresca

0

我想要插入一张图片到 SQL 数据库中,所以我在 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");
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接