首页 > 解决方案 > 使用 MariaDB C++ 连接器获取具有字段名称的 SELECT 字段类型

问题描述

我有一个 MariaDB 选择,它在通用 C++ 类中处理。我需要获取选择字段类型以进行处理,以防它是 FLOAT 或 DOUBLE,但所有字段都由相同的函数处理。一个例子:

std::string sqlwrap::operator [] (std::string field_name)
{
    nflog ();
    if (!_res || _type == sql_void || _type == sql_invalid)
        return "";

    std::string res;
    try {
        res = _store->getString(field_name);
    } catch (sql::SQLException & e) {
        logp (sys::e_debug, "SQL exception: "
              << e.what());
    }
    return res;
}

在此函数中,我必须检查它是否为 FLOAT,然后更改“。” (小数点)由','(一些欧洲国家的小数点)。

这可能是在排队的东西...

std::string sqlwrap::operator [] (std::string field_name)
{
    nflog ();
    if (!_res || _type == sql_void || _type == sql_invalid)
        return "";

    std::string res;
    try {
        res = _store->getString(field_name);
        switch (_store->getFieldType(field_name)) {
            case DOUBLE:
                res = change_dots_by_comma(res);
                break;
            default:
        }
    } catch (sql::SQLException & e) {
        logp (sys::e_debug, "SQL exception: "
              << e.what());
    }
    return res;
}

我知道有 FORMAT 函数,但我想知道是否可以使用 MariaDB C++ 连接器获取带有字段名称的字段类型。我不想在选择中使用 FORMAT。

标签: c++mariadb

解决方案


使用适当的“区域设置”来获取“小数点”、“千位分隔符”等。还要注意在 MariaDB 的FORMAT().

有关列的架构信息:

SELECT * FROM information_schema.COLUMNS
    WHERE table_schema = "database_name"
      AND table_name = "table_name"
      AND column_name = "column_name"

FLOAT 和 DECIMAL 的示例:

CREATE TABLE `dec184` (
  `d` decimal(18,4) DEFAULT NULL,
  `d2` decimal(18,4) NOT NULL,
  `dx` float DEFAULT NULL,
  `dv` float DEFAULT NULL
)

从查询:

*************************** 2. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: try
              TABLE_NAME: dec184
             COLUMN_NAME: d2
        ORDINAL_POSITION: 2
          COLUMN_DEFAULT: NULL
             IS_NULLABLE: NO
               DATA_TYPE: decimal
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: 18
           NUMERIC_SCALE: 4
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
             COLUMN_TYPE: decimal(18,4)
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT: 
*************************** 3. row ***************************
           TABLE_CATALOG: def
            TABLE_SCHEMA: try
              TABLE_NAME: dec184
             COLUMN_NAME: dx
        ORDINAL_POSITION: 3
          COLUMN_DEFAULT: NULL
             IS_NULLABLE: YES
               DATA_TYPE: float
CHARACTER_MAXIMUM_LENGTH: NULL
  CHARACTER_OCTET_LENGTH: NULL
       NUMERIC_PRECISION: 12
           NUMERIC_SCALE: NULL
      DATETIME_PRECISION: NULL
      CHARACTER_SET_NAME: NULL
          COLLATION_NAME: NULL
             COLUMN_TYPE: float
              COLUMN_KEY: 
                   EXTRA: 
              PRIVILEGES: select,insert,update,references
          COLUMN_COMMENT: 

推荐阅读