我正在使用Firebird数据库2.0版。当我尝试更新一行时,收到错误消息:尝试更新只读数据库。
http://www.firebirdfaq.org/faq359/建议我可以查询使用与连接字符集不同的字符集的Blob字段。
我确实查询blob字段,并且当blob字段具有值时,更新将导致错误。如果Blob中没有值,则更新就可以了。
我使用IBConsole打开firebird数据库并检查数据库元数据,发现元数据显示为“默认字符集NONE”。
要解决此问题,我首先需要知道数据库中使用的字符集是什么。
所以我的问题是:
我的数据库使用什么字符集(连接字符集)
blob字段的数据类型为MEMOBLOB,并将MEMOBLOB创建为Create domain MEMOBLOB as blob sub_type TEXT segment size 80;那么MEMOBLOB的字符集是什么?
答案 0 :(得分:3)
不,这与查询或BLOB无关。
Firebird数据库有多种模式,其中一种是“只读”的。在这种模式下,不允许对数据库进行任何更改。
您可以使用gfix
实用程序来更改此数据库模式。您还可以在IBExpert和使用Firebird Services API
您发布的链接-http://www.firebirdfaq.org/faq359/-表示:
这并不意味着数据库文件是只读的,但是它(数据库)包含只读标记
另请参阅https://www.firebirdsql.org/manual/gfix-dbmode.html
另请参阅https://www.ibexpert.net/ibe/pmwiki.php?n=Doc.DatabaseProperties
切向问题:
我的数据库使用的字符集
根据您的文字,它是无。
确切地说,数据库不使用某些字符集。所做的是每个文本列(char / varchar / blob sub_type文本)。但是通常,开发人员不必为每个列的字符集指定麻烦,因此它们继承了默认的字符集。
元数据说“默认字符集为无”
这与“数据库字符集”尽可能接近。
已授予,这只是默认之一,您可以在创建列时覆盖它,但我认为您没有这样做。因此,您所有的文本列都可能具有字符集“ NONE”。
这是一个非常危险的设置,这意味着此类列中的所有文本都作为原始字节转储存储,希望应用程序能够正确猜测如何将字节转换为字母以及将字母转换为字节。
Flame Robin默认情况下似乎不显示字符集,但也许在DDL部分中会显示。 http://www.flamerobin.org/images/screenshots/0.6.0/gtk2/property_page.png
IBExpert会:https://www.ibexpert.net/ibe/uploads/Doc/dmiles783.gif
(连接字符集)
....不是“数据库使用的字符集”,而是将应用程序(例如IBConsole或FlameRobin或IBExpert)连接到数据库所使用的字符集。 您必须在每个应用程序的连接属性中进行设置。最简单的选择是UTF-8,但是当您没有NONE-charset列时,它可能会失败...
例如在FR中:http://www.flamerobin.org/images/screenshots/0.7.1/winxp/databaseinfo.png
您可以使用monitoring tables
来查询CURRENT_CONNECTION
的字符集ID,有关更多信息,请访问https://www.firebirdsql.org/file/documentation/reference_manuals/fblangref25-en/html/fblangref-appx05-monattach.html
答案 1 :(得分:1)
为相关表添加交易参数之后。它解决了这个问题。 我添加的参数值为isc_tpb_lock_write和isc_tpb_shared。
谢谢Arioch'The。