Firebird upgrade 2.1 to 2.5(その2)
カテゴリー: ぷろぐらみんぐ/データベース
2011-03-09
Firebird upgrade 2.1 to 2.5(その2)
Firebird2.5へアップグレード(その2)
どうやら、metadataというものが、2.5からutf8で保存されるようになったようだ。
データ部分は、デフォルトのデータベースの文字セットと同じになっている気がする。
Firebird2.5から
データベース NONE
だとアップグレード時にgbakがリストアで失敗するので
データベース に文字コードを指定して構造を先に作成したあと、
TIBDatabaseを2つ用意して
Tableループでテーブルのコピーをさくっとして正常動作しました。
(手順としては、データフィールド以外は無視+NULLも)
テーブルのリストは、IBDatabase1.GetTableNames(Tables, False);で取得できます
if (current_field.FieldKind <> fkData)
or
(current_field.IsNull)
then
Continue;
// コピー
destTable.FieldByName(current_field.FieldName).AsVariant := current_field.AsVariant;
Shift_JISから、UTF8へ保存する場合は、破損する場合があるので注意しよう。
将来性を考えて、
専用変換ソフトを作って、ワンプッシュで新しいデータベースにコピーできるようにしました。
(TableとGENをコピー)
ここは、素直に、データベースとアプリケーションとも同じ文字コードで接続したいと思います。
Todo: データ移行ソフトのコピー後の全データ照合。
【まとめ】
Firebird 2.5 のまとめ
UPPER関数でエラー
UTF8以外で接続して、UPPERを呼ぶとエラーが発生することがある。
おそらく内部的なバグが原因。
UPPERを除くとエラーは起きない。
とりあえず、Shift_JIS - Shift_JIS 接続で動くので、
テストしてアプリケーションの問題箇所を数カ所修正して大丈夫になりました。
結局
文字 'Ⅱ' の変換(UTF8→SJIS)で落ちていることがわかりました。
CP943Cにすることで解決。
今日のキーワード
さぁ Dot Netへレッツゴー!
C#で らくらくプログラミング
執筆:2011/03/07
編集:2011/03/07
編集:2011/03/07
Firebird2.5へアップグレード(その2)
どうやら、metadataというものが、2.5からutf8で保存されるようになったようだ。
データ部分は、デフォルトのデータベースの文字セットと同じになっている気がする。
Firebird2.5から
データベース NONE
だとアップグレード時にgbakがリストアで失敗するので
データベース に文字コードを指定して構造を先に作成したあと、
TIBDatabaseを2つ用意して
Tableループでテーブルのコピーをさくっとして正常動作しました。
(手順としては、データフィールド以外は無視+NULLも)
テーブルのリストは、IBDatabase1.GetTableNames(Tables, False);で取得できます
if (current_field.FieldKind <> fkData)
or
(current_field.IsNull)
then
Continue;
// コピー
destTable.FieldByName(current_field.FieldName).AsVariant := current_field.AsVariant;
Shift_JISから、UTF8へ保存する場合は、破損する場合があるので注意しよう。
将来性を考えて、
専用変換ソフトを作って、ワンプッシュで新しいデータベースにコピーできるようにしました。
(TableとGENをコピー)
ここは、素直に、データベースとアプリケーションとも同じ文字コードで接続したいと思います。
Todo: データ移行ソフトのコピー後の全データ照合。
【まとめ】
Firebird 2.5 のまとめ
データベース の文字コード |
Clientの 文字コード |
|
NONE | SJIS | データは Shift_JIS。 2.1から2.5にアップグレードできず。 (gbakのリストアができない)。 特定の文字で落ちている |
CP943C | ||
CP943C | CP943C | Japanese 不明。 Shift_JISもどき? Shift_JISは、CP932なので不明。 |
SJIS | SJIS | UPPER関数でエラー。 (2.1からのアップグレードに関しては、不明。 metadataの更新が必要?) |
utf8 | SJIS | Ⅱなどの文字で落ちるので使用しないこと。 FirebirdのSJISは、Shift_JISではないので注意。 |
utf8 | CP943C | 表示が遅くなる。 |
utf8 | UTF8 | 未確認だがおそらく文字変換が介入しないので大丈夫 |
UPPER関数でエラー
UTF8以外で接続して、UPPERを呼ぶとエラーが発生することがある。
おそらく内部的なバグが原因。
UPPERを除くとエラーは起きない。
arithmetic exception, numeric overflow, or string truncation
Cannot transliterate character between character sets.
Cannot transliterate character between character sets.
とりあえず、Shift_JIS - Shift_JIS 接続で動くので、
テストしてアプリケーションの問題箇所を数カ所修正して大丈夫になりました。
結局
文字 'Ⅱ' の変換(UTF8→SJIS)で落ちていることがわかりました。
CP943Cにすることで解決。
今日のキーワード
SJIS | lc_ctype=SJIS | 文字 Ⅱ で エラー |
CP943C | lc_ctype=CP943C | Shift_JIS 接続? |
さぁ Dot Netへレッツゴー!
C#で らくらくプログラミング