我正在使用Firebird 2.5.1和普通的Varchar ... 然后我想使用Unicode升级所有数据(访问Delphi XE2,DBExpress) 我搜索但没有很好的帮助.. 那么你能告诉我如何将我的数据升级到unicode firebird吗? 非常感谢...祝你有愉快的一天。
答案 0 :(得分:1)
答案 1 :(得分:0)
在Firebird中,您必须为每个varchar字段指定一个字符集。所以没有“正常”varchar。如果未在CREATE TABLE语句中明确指定它,Firebird将使用数据库的缺省字符集
Firebird中有一些可用的字符集。可能你的意思是ASCII或带有“正常”的ISO-Charset。除了这些chacsets,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-domains,并使用一个单语句进行更改。
答案 2 :(得分:0)
您可以使用以下方法:
以下是数据转换代码的示例:
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
对于真实世界的应用程序,应修改此代码以便: