Microsoftの「Windows純正付加価値プログラム」のシニアプロダクトマネージャーであるアレックス・コチス氏はブログで、このエラーは人為的ミスが原因であり、その結果、WGAを実行しているサーバーに新しいソフトウェアが誤ってロードされたと述べた。は正常に動作し、正規のソフトウェア ユーザーからの正当なアプリケーションは正しく処理できません。 顧客が使用するデータベースはMySQLであり、開発した製品はOracleに対応しており、顧客がお金を払うためにはデータベース環境をOracleからMySQLに変更する必要があります。変換プロセス中に次の問題が発生しました。同じ問題に遭遇した同僚に参考になれば幸いです。初期の設計およびコーディングのプロセスでデータベースの移植性に注意を払えば、この場合は追加の作業を行う必要はありません。
1. データベース環境が Oracle から MySQL に変更されたときに発生する問題。
ロジックは変更されないため、原則としてアプリケーション コードは変更せず、データベース テーブルの作成/初期化 SQL のみを変更します。以下に、私たちが遭遇した問題とその解決策を示します。
1. 大文字と小文字を区別する違い (サーバー OS が Linux の場合)。
Oracle では通常、大文字と小文字が区別されません。 Oracle を使用する場合、テーブル名とフィールド名は大文字と小文字が区別されないことがあります。このように、insert into tableName と insert into TABLENAME は同じ効果を持ちます。データの初期化スクリプトを実行すると、取得された結果は通常、大文字のテーブル名とフィールド名に変換されます。
ただし、MySQL では、使用されるオペレーティング システムの大文字と小文字の区別によって、データベース名とテーブル名の大文字と小文字の区別が決まります。データベースはデータ ディレクトリ内のディレクトリに対応し、データベース内の各テーブルはデータベース ディレクトリ内の少なくとも 1 つのファイル (ストレージ エンジンに応じて複数) に対応します。したがって、データベースまたはテーブルの使用は実際にはこれらのファイル (フォルダー) を操作することになるため、オペレーティング システムの大文字と小文字の区別によってデータベース名とテーブル名の大文字と小文字の区別が決まります。 Linux をカーネルとして使用するオペレーティング システムでは、大文字と小文字が区別されます。
解決策は、MySQL のデータベース名を Oracle の場合と一致させ、テーブル名をアプリケーションの SQL 文字列のテーブル名と一致させることです。アプリケーションのフィールド名に二重引用符が使用されている場合は、フィールド名を変更してください。 SQL では、名前の大文字と小文字は、二重引用符で囲まれた文字と一致している必要があります。アプリケーションが参照するテーブル名とフィールドの大文字小文字が統一されていない場合、大きな問題が発生します。
2. 予約語の違い。
SQL 言語の関数名 (intember、show など) は予約語です。 Oracle の予約語はテーブル名およびフィールド名として使用でき、その使用には影響しません。ただし、MySQL の予約語をテーブル名およびフィールド名として使用すると、構文エラーが報告されます。
解決策は、SQL ステートメント内の予約語を「`」記号で囲むことです。これは、キーボードのタブ キーの上にあり、それがフィールド名の場合は、別のメソッド tablename.field name があります。次のように: insert into tablename (id, `interval`) value(….. または insert into tablename (id, tablename.inteval) value(….. .
3. データ型の違い。
mysql には、oracle のような varchar2 と数値はありません。もちろん、oracle には、対応する varchar と数値がありません。
解決策は交換です。
4. 自動成長タイプの違い。
Oracle にはシーケンスがありますが、mysql にはありませんが、auto_increment 属性があります。
解決策は、Oracle で auto_increment 属性を使用するように変換することです。場合によっては、自動増加データを記録する新しい独立テーブルを作成する方法もあります。
5. インデックスの長さ制限の違い。
MySQL 4.1.2 以降、MyISAM テーブルと InnoDB テーブルのインデックス長は 1000 バイトをサポートします。つまり、インデックス フィールドの長さが 1000 バイトを超えると、次のエラーが報告されます: ERROR 1071 (42000):指定されたキーが長すぎます。キーの最大長は 1000 バイトです。 UTF-8 エンコーディングの場合、これは 333 文字の長さに相当します (UTF8 の 1 文字は 3 バイトを占有するため)。 Oracle のインデックスの長さの制限は、MySQL よりもはるかに緩いです。
解決策について詳しく説明する必要はありません。インデックスの定義を変更したり、フィールドの定義長を変更したりする必要はありません。
2. データベースの互換性について何に注意する必要がありますか?
データベースの互換性は、データベースの設計時に注意を払う必要がある問題です。顧客がすでに使用しているデータベースを所有しており、同時に 2 つのデータベースを維持したくない場合があるためです。この場合、複数のデータベースとの互換性も考慮する必要があります。製品のセールスポイント。
データベースの互換性を実現する鍵は、標準的な使用法に従うことです。
1. 標準的な使用法に従い、特定のデータベース固有の使用法は使用しないようにしてください。
msyqlの「`」記号の使い方など、
別の例として、Oracle を使用してシーケンスを作成する場合、テーブルにデータを挿入する前に SELECT seq.nextval FROM DUAL; を使用し、クエリから取得した値を値としてテーブルに挿入します。シーケンスのないデータベースには適していません。必要な場合は、それを完全に使用する必要があります。
別の例として、さまざまなデータベースには拡張されたページング クエリがありますが、Postgresql にはオフセットと制限がありますが、Oracle にはありません。
2. データベースの大文字と小文字の区別の問題を回避します。
データベースのテーブル名とフィールド名を大文字にするか小文字にするかを選択し、データベースの設計およびコーディング中に完全に統一します。
3. 予約語。
データベース設計者は、テーブル名やフィールド名に予約語を使用しないように努める必要があります。 create table _tablename (_id integer) のように、テーブル名とフィールド名の前に「_」を追加してこの方法を使用する人もたくさんいます。こうすることで、予約語に起因する問題が発生することはありません。