如何升级Firebird的Unicode数据?
我正在使用Firebird 2.5.1和普通Varchar。。。 然后我想使用Unicode升级所有数据(访问Delphi XE2、DBExpress) 我找了些帮助,但没有找到。。 那么你能建议我如何将我的数据升级到unicode firebird吗?如何升级Firebird的Unicode数据?,unicode,firebird,Unicode,Firebird,我正在使用Firebird 2.5.1和普通Varchar。。。 然后我想使用Unicode升级所有数据(访问Delphi XE2、DBExpress) 我找了些帮助,但没有找到。。 那么你能建议我如何将我的数据升级到unicode firebird吗? 谢谢。。。祝您度过愉快的一天。在Firebird中,您必须为每个varchar字段指定一个字符集。所以没有“正常”的varchar。如果未在CREATE TABLE语句中明确指定,Firebird将使用数据库的默认字符集。 Firebird中有
谢谢。。。祝您度过愉快的一天。在Firebird中,您必须为每个varchar字段指定一个字符集。所以没有“正常”的varchar。如果未在CREATE TABLE语句中明确指定,Firebird将使用数据库的默认字符集。
Firebird中有几个可用的角色集。可能您指的是ASCII或带“normal”的ISO字符集。除了这些CHACSET之外,Firebirds还支持UNICODE_FSS或UTF8。 可以更改数据库中字段的字符集。
首先,您必须找出首选角色集使用的id。为此,您可以查看表RDB$CHARACTER_SETS
之后,您需要找出要更改的列所使用的域。如果在CREATE TABLE语句中未指定自定义域,Firebird将为每列生成一个自定义域。
然后,您可以在系统表中更改此域使用的字符集
update RDB$FIELDS T1
set T1.RDB$CHARACTER_SET_ID = 4
where RDB$FIELD_NAME = (select RDB$FIELD_SOURCE
from RDB$RELATION_FIELDS T2
where T2.RDB$RELATION_NAME = 'NEW_TABLE'
and T2.RDB$FIELD_NAME = 'NEW_FIELD')
或者,您可以在系统表中查找所有varchar域,并用一条语句对其进行更改。您可以查看迁移情况,或者使用类似的工具。您可以使用以下方法:
EXECUTE BLOCK
AS
DECLARE VARIABLE fn CHAR(31) CHARACTER SET UNICODE_FSS;
DECLARE VARIABLE rn CHAR(31) CHARACTER SET UNICODE_FSS;
DECLARE VARIABLE cl INTEGER;
BEGIN
FOR
SELECT
r.rdb$field_name,
r.rdb$relation_name,
f.rdb$character_length
FROM
rdb$relation_fields r JOIN rdb$fields f
ON f.rdb$field_name = r.rdb$field_source
WHERE
f.rdb$character_set_id >= 10
AND f.rdb$character_length > 0
AND f.rdb$field_sub_type IS NULL
INTO :fn, :rn, :cl
DO BEGIN
EXECUTE STATEMENT 'ALTER TABLE "' || :rn ||
'" ADD unique_temp_field_name VARCHAR(' || :cl ||
') CHARACTER SET UNICODE_FSS'
WITH AUTONOMOUS TRANSACTION;
EXECUTE STATEMENT 'UPDATE "' || :rn ||
'" SET unique_temp_field_name = "' || :fn || '"'
WITH AUTONOMOUS TRANSACTION;
EXECUTE STATEMENT 'ALTER TABLE "' || :rn || '" DROP "' || :fn || '"'
WITH AUTONOMOUS TRANSACTION;
EXECUTE STATEMENT 'ALTER TABLE "' || :rn ||
'" ALTER unique_temp_field_name TO ' ||
'"' || :fn || '"'
WITH AUTONOMOUS TRANSACTION;
END
END
对于实际应用程序,应修改此代码,以便:
如果您在系统表中更改此域使用的字符集:您不会在良好的字符集中编码数据!我用字符集为WIN1252(包括德语特殊字符)的列进行了尝试。在将其更改为UNICODE_FSS后,它仍能按预期工作。因此,在一些场景中,不需要重新编码数据。