在我的django API的一部分中,我有以下内容,以更新旧笔记:
old_note = request.databaseSession.query(Tmemo).\
filter(Tmemo.memosern1 == serial).\
one()
这个查询没有任何问题,因为我在许多其他地方使用它。奇怪的问题来自:
old_note.memotext = newtext
然后,当我提交时,会发生以下错误:
ProgrammingError: (pyodbc.ProgrammingError) ('42000', u'[42000]
[Microsoft][ODBC Driver 17 for SQL Server][SQL Server]The data types
text and text are incompatible in the equal to operator. (402)
(SQLExecDirectW)') [SQL: u'UPDATE tmemo SET memotext=? WHERE
tmemo.memosern1 = ? AND tmemo.memosern2 = ? AND tmemo.memotype = ? AND
tmemo.memotext = ?'] [parameters: ('asassasasasaassaassaasas2121',
u'P03000000060445', u'MEMO', u'5', u'asassasasasaassaassaasas')]
(Background on this error at: http://sqlalche.me/e/f405)
Tmemo只是一个包含序列号memosern1
和memosern2
列的表格,其中memotype
类型,注释本身为memotext
,序列号和类型为varchar和memotext作为文本。我真的不明白text and text are incompatible
究竟是什么意思,没有意义,我只是过滤序列号,没有别的,那么这个奇怪的查询是什么呢?
我可以在表格中完美地创建另一行,使用完全相同的变量(newtext
),我无法更新现有的行。
任何想法?我可以提供更多信息
答案 0 :(得分:2)
TEXT
- 类型实际上只是BLOB
并且可能非常大,具体取决于您的数据库服务器2 ** 64-1字节甚至更多。由于它的(可能)大小,TEXT
和BLOB
没有实现等于运算符,因此您无法将类型TEXT
的值与任何内容进行比较(在您的情况下{{1} }})。
你需要做的是使用TEXT to TEXT
或者 - 或者稍微有点hacky - 计算并存储VARCHAR
- 列的哈希值,然后进行比较。如果你计算TEXT
- 值的MD5()
,只将高64位存储为TEXT
并在该列上放置一个功能索引,你基本上可以得到相同的结果而不会过多成本(插入/更新时的额外散列+索引操作除外,并且将某些内容与不相等的相等性进行比较的可能性非常小)。
从长远来看,您应该使用INT
代替VARCHAR
,因为TEXT
将是removed from future versions of SQL Server.