文章 "如何从 MQL5 (MQL4) 访问 MySQL 数据库" - 页 29

 
Viktor Vasilyuk #:

谢谢你的解释。我不可能什么都知道,这就是我问这个问题的原因。

在这里 找到了自己的解决方案。

附:检查了 SELECT - 可以使用

好吧,查询结果的转换是允许的,但不要忘了你在表级别定义了 utf8mb4,也就是说,默认情况下所有字段都使用 varchar,如果你在查询中为文本字段设置了条件,MySQL 会尝试隐式转换。如果考虑到可能会在文本列上建立索引,那么优化器在这种转换过程中就可能无法识别它......从而导致查询性能问题。
因此,最好在表级别和列定义级别都对此类问题进行控制。
 
Eugeniy Lugovoy #:
查询结果转换是允许的,但不要忘了你在表级别定义了 utf8mb4,即默认情况下所有字段都使用 varchar,如果你在查询中对文本字段设置了条件,MySQL 会尝试隐式转换它。如果考虑到可能会在文本列上建立索引,那么优化程序在转换过程中就可能无法识别它......从而影响查询性能。
因此,最好在表级别和列定义级别都对此类问题进行控制。

有一个描述字段。类似于 "注释",这个字段不是必须的,只是一个文本解释。没有索引。

MySQL 默认使用 utf8mb4。你能告诉我下次如何在 DDL 中指定吗? 要更改什么内容和编码

 
出于好奇,MQLmySQL 对数据库类型挑剔吗? 我们遇到了一个问题,在迁移到新数据库之前,我们的脚本一直可以连接到数据库。 突然,我们遇到了读/写/删除问题。 3306 端口的所有权限都已启用,新数据库只是旧数据库的一个副本。

有什么想法吗?
 
Boaz Nyagaka Moses #:
我一直收到这样的错误:
2022.03.02 20:22:25.198 MySQL-001 EURUSD,M15: Connection error #2059 Authentication plugin 'caching_sha2_password' cannot be loaded:找不到指定模块。

您设法解决了这个问题吗?

 

有没有办法知道在 MySqlCursorFetchRow 之后可以检索的字段数量?

也许是某个隐藏函数,如 RowFieldsSize ...


据我所知,如果没有字段,MySqlGetFieldAsString 会返回空值。但如果 String Field 特别包含一个空字段,它也会返回空。也就是说,并不是每次都能通过暴力手段追踪到字段的数量。


作为拐杖,你可以先通过 sql 命令找出字段,然后再选择一次,但这已经是不必要的选择了。



请开发这个库,它非常有用。当然,很久以前就有一对夫妇将 mysql 内置到 mt 中了。

 

插入和更新查询 - 查询限制只有 16 kb?


如果查询超过 16.000 个字符,metatrader 就会崩溃(关闭)。

我附上一个更新 32.000 个字符的示例。


数据库中的更新字段 - LONGTEXT

附加的文件:
test2.txt  64 kb
 
andreysneg #:

插入和更新查询 - 仅有 16kb 的查询限制?


如果查询超过 16.000 个字符,metatrader 就会崩溃(关闭)。

我在附件中提供了一个 32.000 个字符的 UPDATE 查询示例。


数据库中的更新字段 - LONGTEXT

这更像是 MQL 中的行大小限制 :-(

您可以写得更紧凑

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

和/或将两个查询合并为一个事务,将其拆分为两个查询

 
您好!请教专家一个问题--我可以从 MySQL 到 MT5 读取多少数据以及多久读取一次?
例如,我有 50 000 个元素的数据,我每 0.1 秒在表中更新一次(数字)。MT5 能否从 MySQL 中读取这些数据并每 0.1 秒更新一次?这篇文章中给出的每 1 次查询 KB 的功能是否有任何限制?
 
Alex Renko #:
您好!请教专家一个问题--我可以从 MySQL 到 MT5 读取多少数据以及多久读取一次? 例如,我有 50 000 个元素的数据,我每 0.1 秒在表中更新一次(数字)。MT5 能否从 MySQL 中读取这些数据并每 0.1 秒更新一次?这篇文章中给出的 KB 1 查询功能是否有任何限制?

这个问题很有意思...

我必须说,对返回的 SELECT 查询行数没有限制。

查询本身的大小限制是 64 Kb。因此,如果您要更新 50K 行数据,最好将它们分成几批,比如每批 1000 行,然后发送 50 个查询。

至于 100 毫秒的速度,如果数据库在一台服务器上,而执行 MQL 的终端与数据库的连接有点远,那么很可能会遇到网络延迟,其大小为 ping....。

例如,如果数据库服务器和终端之间的 ping 为 60 毫秒,则服务器的实际响应延迟 = 60 毫秒(查询)+ 数据库端的查询处理时间 + 60 毫秒(响应)。


本项目只是一个简单的包装器,用于访问动态 mysql 库的功能。

这套功能仅限于实际有用的主要功能,你可以进行扩展,添加你需要的功能,比如添加对异步查询的支持,然后你就可以在 1000 行中发送所有 50 个查询,而无需依次等待每个查询的执行。


附注:你可以在 Github 上看到库源和预设限制(https://github.com/elugovoy/MQLMySQL-Project/tree/master/MQLMySQL)

附注:您也可以下载、自行修改、编译和测试。

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 会返回空值。但如果字符串字段特别包含一个空字段,它也会返回空值。也就是说,并不是每次都能通过暴力手段跟踪字段的数量。


作为一种辅助手段,你可以先通过 sql 命令找出字段,然后再选择一次,但这已经是不必要的选择了。



请开发这个库,它非常有用。当然,mysql 早就应该内置于 mt 中了。

嗯...什么样的查询对你来说如此棘手,以至于有必要确定它返回的字段数?

通常在 SELECT 命令中只列出特定情况下需要的内容。不要使用 SELECT*,只选择你需要的:)这是正常做法。

您不应该制作拐杖,您可以从 Github 获取源代码,并为 mysql_fetch_fields() MySQL API 函数添加一个包装器