記事"MQL5 (MQL4)から MySQL データベースにアクセスする方法"についてのディスカッション - ページ 29

 
Viktor Vasilyuk #:

説明してくれてありがとう。私はすべてを知ることはできない。

私はここで 自分自身のための解決策を見つけました。

追伸:SELECTをチェックしました。

クエリ結果の変換は可能ですが、テーブルレベルで utf8mb4 の定義があることを忘れないでください。つまり、デフォルトではすべてのフィールドで varchar が使用され、クエリでテキストフィールドの条件がある場合、MySQL は暗黙的に変換しようとします。また、テキストカラムにインデックスが構築されている可能性を考慮すると、オプティマイザはこのような変換の際にインデックスを検出しない可能性があります。
そのため、このようなことはテーブルレベルとカラム定義のレベルの両方で制御することが望ましい。
 
Eugeniy Lugovoy #:
クエリ結果の変換は可能ですが、テーブルレベルでutf8mb4が定義されていること、つまりすべてのフィールドでvarcharがデフォルトで使用されていることを忘れないでください。また、テキストカラムにインデックスが構築されていることを考慮すると、オプティマイザはそのような変換の際にインデックスを検出しない可能性があります。
そのため、このようなことはテーブルレベルとカラム定義のレベルの両方で制御することが望ましい。

説明フィールドがあります。comments "のようなもので、フィールドは必要ない。インデックスはない。

MySQL utf8mb4がデフォルトです。次回、DDLでどのように指定すればよいのか教えてください。 何をどのエンコーディングに変更すればよいのでしょうか

 
MQLmySQLはデータベースの種類にうるさいのでしょうか? 私たちは、新しいデータベースに移行するまで、スクリプトがデータベースに接続していた問題に遭遇しています。 突然、読み取り/書き込み/削除の問題が発生しました。ポート3306のすべてのパーミッションは有効になっており、新しいデータベースは単に古いデータベースのコピーです。

何かアイデアはありますか?
 
Boaz Nyagaka Moses #:
次のエラーが出続けます:
2022.03.02 20:22:25.198 MySQL-001 EURUSD,M15: 接続エラー #2059 認証プラグイン 'caching_sha2_password' をロードできません:指定されたモジュールが見つかりません。

この問題を解決できましたか?

 

MySqlCursorFetchRow の後に取得できるフィールド数を知る方法はありますか?

たぶん RowFieldsSize のような隠された関数があると思います。


私が理解しているように、フィールドがない場合、MySqlGetFieldAsString は空文字列を返します。しかし、String Field に空のフィールドが含まれている場合も、空文字列を返します。つまり、総当たりでフィールドの数を追跡できるとは限りません。


代替手段としては、まずsqlコマンドで調べてから、もう一度selectするという方法があるが、これはすでに不要なselectである。



ライブラリの開発をお願いします。もちろん、ずっと前にmtに組み込むmysqlのカップル

 

クエリの挿入と更新 - クエリの上限は 16 KB だけですか?


クエリが16.000文字を超えるとメタトレーダーはクラッシュ(終了)します。

32.000文字のUPDATEの例を添付します。


データベースの更新フィールド - LONGTEXT

ファイル:
test2.txt  64 kb
 
andreysneg #:

クエリの挿入と更新 - クエリの制限は16kbだけですか?


クエリが16.000文字を超えるとメタトレーダーはクラッシュ(終了)します。

32.000文字のUPDATEの例を添付します。


データベースの更新フィールド - LONGTEXT

これはMQLの行サイズ制限に近いものです :-(

よりコンパクトに書くことができます:

REPLACE d1 ("t", "o", "h", "l", "c") VALUES (time1,open1,high1,low1,close1), (time2,open2,high2,low2,close2) ....

あるいは、2つのクエリを1つのトランザクションに結合して、2つのクエリに分割する。

 
例えば、50,000 の要素があり、0,1 秒ごとにテーブルを更新します。MT5はMySQLからデータを取得し、0.1秒ごとに更新することができますか?この記事で紹介されている機能には、1クエリあたりのKBに制限はありますか?
 
Alex Renko #:

例えば、50,000 の要素があり、0,1 秒ごとにテーブルを更新します。MT5はMySQLからデータを取得し、0.1秒ごとに更新することができますか?この記事で紹介されている機能には、1クエリに対するKBの制限はありますか?

まあ、その質問は確かに興味深いです...

返されるSELECTクエリの行数に制限はありません。

クエリー自体のサイズ制限は64KBです。ですから、50k行のデータを更新するのであれば、1000行ずつに分割して、50個のクエリを送信したほうがよいでしょう。

100ミリ秒という速度については、もしデータベースが1つのサーバーにあり、データベースへの接続を持つMQLを実行する端末がある程度離れている場合、ほとんどの場合、pingの大きさでネットワーク遅延に遭遇することになります。

例えば、データベース・サーバーと端末の間のpingが60msの場合、サーバーからの実際のレスポンスは、=60ms(クエリー)+データベース側のクエリー処理時間+60ms(レスポンス)と遅れます。


このプロジェクトは、ダイナミックmysqlライブラリの機能にアクセスするための単純なラッパーに過ぎない。

必要なものを追加して拡張することができます。例えば、非同期クエリのサポートを追加すれば、50のクエリを順番に実行するのを待つことなく1000行で送信することができます。


追伸:Githubでライブラリーのソースとプリセット制限を見ることができます(https://github.com/elugovoy/MQLMySQL-Project/tree/master/MQLMySQL)

P.P.S.: ダウンロードして、自由に変更し、コンパイルしてテストすることもできます。

MQLMySQL-Project/MQLMySQL at master · elugovoy/MQLMySQL-Project
  • elugovoy
  • github.com
MQL & DLL libraries for working with MySQL database - elugovoy/MQLMySQL-Project
 
andreysneg #:

MySqlCursorFetchRow の後に取得できるフィールドの数を知る方法はありますか?

RowFieldsSize のような隠し関数があるかもしれません。


私が理解しているように、フィールドがない場合、MySqlGetFieldAsString は空文字列を返します。しかし、String Field に空のフィールドが含まれている場合も、空文字列を返します。つまり、総当たりでフィールドの数を追跡できるとは限りません。


代替手段として、まずsqlコマンドでフィールドの数を調べ、それからもう一度selectすることもできますが、これはすでに不必要なselectです。



ライブラリの開発をお願いします。もちろん、mysqlのいくつかはとっくの昔にmtに組み込まれているはずだ。

ふむ...。どのようなクエリが、それによって返されるフィールドの数を決定する必要があるほど厄介なのですか?

通常SELECTコマンドでは、特定の状況で必要なものだけを列挙する。SELECT*を 使わず、必要なものだけを選択する。

Githubからソースコードを取得し、 mysql_fetch_fields() MySQL API関数のラッパーを追加することができます。