database - 我的数据库如何在不设置端口的情况下连接?

标签 database qt

我正在使用 Qt 连接到数据库(到目前为止使用 PostgreSQL 和 mySQL),并且对端口的工作方式有点困惑。我正在使用 Ubuntu,如果这有什么区别的话。

根据此处的文档:http://doc.qt.nokia.com/4.8-snapshot/qsqldatabase.html#setPort端口没有默认值。但是我注意到在我的设置中,我实际上没有设置端口,但它仍然可以毫无问题地连接。

所以我将其设置如下:

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.setHostName("localhost");
db.setDatabaseName("mydb");
db.setUserName("name");
db.setPassword("pass");

哪个有效(我也尝试过使用 mySQL 驱动程序)

如果我这样做:db.setPort(-1);或者正如我所期望的使用默认端口:db.setPort(5432);,它也可以工作

但其他端口无法正常工作,这正如预期的那样。那么,鉴于它说没有默认端口值,并且 -1 显然不是有效端口,它是如何工作的?

最佳答案

Qt 本身可能不提供默认端口值,但各个驱动程序会提供。当你 open通过 Qt,它只是调用 open特定于驱动程序的代码。

例如,Postgress 驱动程序代码包含以下 open功能:

bool QPSQLDriver::open(const QString & db, const QString & user,
  const QString & password, const QString & host,
  int port, const QString& connOpts)
{
  if (isOpen()) close();

  QString conn;

  if (!host.isEmpty())
    conn.append(QLatin1String("host=")).append(qQuote(host));
  :
  if (port != -1)
    conn.append(QLatin1String(" port=")).append(qQuote(QString::number(port)));
  :
  d->connection = PQconnectdb(conn.toLocal8Bit().constData());
  :
  return true;
}

类似地,MySQL 的驱动程序代码通过 (port > -1) ? port : 0作为 mysql_real_connect() 的端口参数,表示值为 -1翻译为0 。而且,正如任何 MySQL 编码员都会告诉您的那样,这会通知 mysql_real_connect()使用默认端口。

换句话说,端口是从 QT 通用默认值 -1 转换而来的。特定驱动程序需要的任何合适的默认值(例如 MySQL 的 3306、DB2 的 50000(或 60000)等)。

如果您确实设置了它,它就会按原样传递给驱动程序。

关于database - 我的数据库如何在不设置端口的情况下连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11683897/

相关文章:

mysql - 关于私有(private) MySQL 实例和 WordPress 的问题

sql - 如何有效地从 Postgresql 8.1 表中删除行?

qt - Qt 中的哪些特性或概念让你感到厌烦?

c++ - 如果在调用 QObject::connect() 之前发出信号,如何避免竞争?

mysql - 使用地名数据库获取城市所属的州和县?

Mongodb 聚合框架和嵌套 $lookup

mysql - 如何在MySQL表中对用户隐藏列

c++ - Qt/嵌入式 : Caps Lock is not working

c++ - QAudioDecoder 支持哪些音频格式?

c++ - 如何将具有 16 位整数的图像转换为 QPixmap