MySQL
最終更新日: 2024年3月18日
仕様および制約
- 順序が用意されていないため、順序はテーブルを利用して擬似的に扱います。
- 日本語カラム名を設定するとエラーが発生することがあります。
- MySQLは、主キー(複合主キーも合わせて)の長さは 1023 バイト以内でなければならないという制約があります。この制約を越えるようなモデルの定義を行った場合、テーブル作成時に次のようなエラーが発生します。
「java.sql.SQLException: Specified key was too long; max key length is 1024 bytes」
上記エラーが発生した場合には、モデルの定義を見直し主キーの長さが 1023 バイト以内に収まるようにしてください。 - テーブル名(Wagbyのモデル名)の最大長は 64 文字です。
- カラム名(Wagbyのモデル項目名)の最大長は 64 文字です。
- MySQL 5.7 より、インデックスの最大長は 3072 バイトになりました。例えば文字列型の項目を3つつなげた場合、各項目が varchar 255 とすると 255 x 3 = 765 バイトで、文字エンコーディング UTF-8 だと 3060 バイトとなり、ぎりぎり許容されます。この解決のためにはデータベースの型を (標準の varchar 255よりも小さくなるように)調整し、全体で 3072 バイトを超えないようにしてください。
- MySQL 5/6/8 ではデータベースの文字エンコーディングに UTF-8 を使用した場合でも、扱える文字は1文字3バイトまでの範囲に制限されます。このため Windows Vista で採用されたサロゲート・ペア文字を登録することができません。[詳細...] これは MySQL 5.5 で utf8mb4 という文字コードを指定することで対応できます。[参考...]
- 1つのテーブル内に含まれる項目のバイト数は、合計で65,535バイト以内になります。例えばintegerは4バイト、というように数えます。詳細はMySQLのマニュアルをお読み下さい。ここでの注意点はvarchar型です。例えばvarchar(255)という文字型項目を100項目定義した場合、255文字の100項目で25,500バイトと捉えてしまいますが、実際にはUTF-8エンコードを採用しているため、さらにその3倍の76,500バイトとなり、制限を超えてしまいます。(MySQLのUTF-8エンコーディングは、1文字3バイトとして扱います。)よって項目数が多いモデル(テーブル)では、文字列型項目はこまめに大きさを指定するなどの工夫が必要になります。
- MySQL 6 以降では文字列型の標準は1文字4バイトになります。そのため上記の "MySQLは、主キー(複合主キーも合わせて)の長さは 1023 バイト以内でなければならない" という制約にかかりやすくなります。データベースの種類に "MySQL 6" を選択すると、文字列型主キーのみ varchar(64) が標準マッピングルールとなります。(ただし、ユーザーが「テーブル定義の型」を明示的に指定した場合は、そちらを優先します。)
- MySQL は大文字と小文字を区別せず検索します。例えば文字列項目に "abc" と登録しているとき、検索画面で小文字 "abc" でも大文字 "ABC" でも検索されます。
型のマッピング
Wagby で指定した型は、データベース内で次のように扱われます。
整数型 | integer |
---|---|
文字列型 | varchar(255) (※1,2) |
文字列型 (テキストエリア) | text (※3) |
日付型 | date |
時間型 | time |
日付時間型 | datetime |
ファイル型(ファイル名) | varchar(255) |
1バイト整数 | tinyint |
2バイト整数 | smallint |
4バイト整数 | integer |
8バイト整数 | bigint |
4バイト浮動小数点数 (※4) | float |
8バイト浮動小数点数 (※4) | double precision |
固定値 (作成日/更新日) | datetime |
その他 (URL型/メールアドレス型など) | varchar(255) |
- モデル参照の場合は、参照先モデルの主キーの型に準じます。
- 開発者の方で型を変更することもできます。詳細は「リポジトリ > モデル項目の定義 > データベースの詳細」をお読み下さい。
パフォーマンスチューニング情報
インポート処理の改善
Wagby のインポート処理では、大量の更新用SQLを発行します。このとき、MySQL がトランザクション毎に物理ディスクに対してログのフラッシュ処理が行われる設定になっていると、処理に時間がかかります。
次のように設定すると、書き込みパフォーマンスが向上します。
innodb_flush_log_at_trx_commit = 0
ただしこの設定のままですと、通常の運用で障害発生時にデータを失う可能性が高まるので、インポート処理が終わり次第、デフォルト値 ("1") に戻すことが求められます。
参考資料
InitLoaderコマンドで複数のSQLを実行させる場合
Wagbyが提供するデータのインポートツールInitLoaderは、開発者が独自に定義したSQL文を実行することができます。
InitLoaderが読み込む設定ファイルに記述したsql要素で、複数のSQLをセミコロンで区切って記述する場合、MySQLのMultiQueries指定を有効にする必要があります。
環境設定ファイル project_env.xls で、MySQL への接続URLの末尾に以下の指定を加えることで、本設定を行うことができます。
&allowMultiQueries=true
参考情報:「Connector/J の Driver/Datasource クラス名、URL シンタックス、および構成プロパティ」
http://dev.mysql.com/doc/refman/5.1/ja/connector-j-reference-configuration-properties.html
トラブルシューティング
"java.time.zone.ZoneRulesException: Unknown time-zone ID: JST" エラーが発生する。
MySQL の JDBC ドライバが 8.0.23 以降の場合に生じます。JDBC接続文字列に含まれるタイムゾーン指定の文字列を次のようにしてください。
&connectionTimeZone=Asia/Tokyo
R8.5.14/R9.1.5/R9.2.1 で、この表記に対応しました。
インポート時に '∞' is not a valid numeric or approximate numeric value エラーが発生する。
NaNが含まれている場合
インポートしようとしている xml ファイルで、小数型の要素に 'NaN' という文字が含まれている場合はエラーになります。
xml ファイルを直接、編集して NaN を取り除いてください。
有効な小数桁を超えている場合
インポートしようとしている xml ファイルで、小数型の要素に MySQL の有効な桁数を超えた数値が含まれている場合はエラーになります。
例えば8バイト浮動小数の項目は MySQL の double precision 型に格納されます。このとき、xml ファイル中の項目の値が "0.06511627906976744" と記述されている場合、MySQL がこの値を正しく処理できずエラーとします。入力値を短くすることでインポート処理を成功させることができます。