【发布时间】:2021-09-24 07:26:47
【问题描述】:
我已经阅读了following thread,并且能够制作一个转换脚本(基于 C#),将我所有的charset=NONE 数据库转换为charset=UTF8,并且大部分都很好用(我还有一些特别的字符转换为奇怪符号的情况,但这是边缘的)。
我的问题是我有很多 备份数据库 文件 (*.fbk),我不确定这是 UTF8 还是 @ 987654327@。在理想情况下,我的代码将根据fbk 文件的格式从文件中恢复数据库后处理转换,因此我只在必要时和恢复后进行转换。
这有可能吗?或者有没有办法在恢复数据库时定义charset(通过gback或通过ADO.NET提供程序)?
【问题讨论】:
-
您要解决的具体问题是什么?数据库本身没有字符集(除了其默认字符集,仅在创建没有显式字符集的新列时使用)。每一列都有一个字符集,每一列都可以有不同的字符集。简而言之,没有通用的方法来确定这一点。
-
没有万能的数据库字符集,实际上每一列都有自己的。此外,当您像
all my charset=NONE databases to charset=UTF8那样说话时,它听起来不是“数据库字符集”而是“连接字符集”,这是一种不同的野兽,尽管有一些关系。您也可以在topanswers.xyz/databases?q=1462的右侧面板(cmets)中阅读更多讨论和一些查询 -
好的,我的默认字符集在任何地方都是“NONE”,因为这是遗留的。在当前状态下,我需要
UTF8,所以我必须将所有数据库转换为包含UTF8数据。正如我发现的那样,这将简化客户端上的很多事情......但是有十几个数据库文件需要我自动化这个过程...... -
你最好做“数据泵送”,创建仅元数据的纯骨架数据库,为列和应用程序的连接设置字符集,打开两个新旧数据库并逐行复制表。您必须弄清楚这些表的顺序,或者有时这些表中的行,分析依赖关系。像 IBExpert(可能还有其他)这样的工具确实具有“将元数据提取到 SQL 脚本”功能,该功能的正确性和现代性只有通过测试才能知道,但对于简单的 DB,它可以工作
-
您需要查询系统表以获取此信息,因此您需要有一个正常运行的数据库来做出此决定。您不能从备份文件本身执行此操作(或者至少,这样做需要您以类似于 gbak 将其还原为数据库的方式自己解析文件)。所以是的,您需要恢复数据库才能执行此操作。现在是否需要再次备份取决于您的流程。
标签: c# character-encoding firebird database-backups firebird-.net-provider