43、Perl DBI 驱动安装、配置与使用指南

Perl DBI 驱动安装、配置与使用指南

1. Perl DBI 驱动安装与配置

安装 Perl DBI 驱动时,只需按照驱动附带的说明进行操作。多数情况下,需要执行一个脚本,将文件复制到 /usr/lib/perl5/site_perl/5.005/ 下的相应目录,并正确设置权限,无需其他特殊配置。

部分数据库包有自己专有的 Perl 接口,例如 MySQL 有 Mysql.pm 包,可通过 Perl 操作 MySQL。不过,大多数数据库厂商现在鼓励用户使用 Perl DBI,这些旧包仍包含在当前的 Perl 发行版中,以确保旧应用程序仍能正常运行。

2. 简单示例

下面以一个连接棒球数据库的示例程序来展示 Perl DBI 的基本使用:

#!/usr/bin/perl -w -T
use DBI;
{
    my $dbh;
    my $sth;
    my $cmd;
    my $restype;
    my $ret_val;
    my $data;
    my @rawResults;
    # 打开与数据源的连接
    $dbh = DBI->connect('dbi:mysql:baseball',
                         'mylogin',
                         'mypassword' );
    if ( !defined($dbh) )
    {
        print "Cannot connect to database.\n";
        exit 1;
    }
    else
    {
        print "Success-Connected to database.\n";
    }
    # 准备 SQL SELECT 语句并执行
    $cmd = "SELECT team_name " .
           "FROM team " .
           "ORDER BY team_name";
    $sth = $dbh->prepare($cmd);
    if (!defined($sth))
    {
        print "Preparation Failed\n";
        $dbh->disconnect();
        exit 0;
    }
    $ret_val = $sth->execute();
    if (!defined($ret_val))
    {
        print "Execution Failed\n";
        $dbh->disconnect();
        exit 0;
    }
    # 将检索到的数据写入标准输出
    $sth->dump_results();
    # 断开与数据源的连接并退出
    $dbh->disconnect();
    exit 0;
}

该程序的主要步骤如下:
1. 加载数据库接口包。
2. 打开与数据源的连接,获取用于访问数据源的句柄。
3. 准备 SQL 语句,获取用于访问与该语句相关资源的句柄。
4. 执行 SQL 语句。
5. 检索从数据源获取的数据(如果有)并显示。
6. 关闭与数据源的连接并退出。

3. 各步骤详细说明
3.1 加载 DBI 包

要加载 DBI 包,需在程序开头添加以下指令:

use DBI;

前提是 Perl 已在你的机器上正确安装和配置。

3.2 打开连接

使用 DBI->connect() 方法打开与数据源的连接,它接受以下参数:

DBI->connect( data_source, login, password );
  • data_source :要打开连接的数据源名称,由三个冒号分隔的字段组成:
  • 第一个字段必须是字符串 dbi
  • 第二个字段是要加载的数据库驱动名称,通常与数据库包名称一致,如 mysql
  • 第三个字段是用于向驱动标识数据源的字符串,可以是配置文件中的条目名称、数据库名称,或一组键值对。
  • login :用于访问数据库的用户名。
  • password :用户密码。

connect() 方法返回一个数据库句柄,如果句柄未定义,则表示连接数据源失败。

例如:

$dbh = DBI->connect('dbi:mysql:baseball',
                     'mylogin',
                     'mypassword' );

该方法还可以接受一个可选的第四个参数,即要传递给数据源的参数哈希引用。

3.3 准备语句

使用数据库句柄的 prepare() 方法准备 SQL 语句,该方法接受一个参数,即要准备的 SQL 语句,并返回一个语句句柄。如果语句句柄未定义,则表示准备语句失败。

示例:

$cmd = "SELECT team_name " .
       "FROM team " .
       "ORDER BY team_name";
$sth = $dbh->prepare($cmd);
3.4 执行语句

使用语句句柄的 execute() 方法执行 SQL 语句,该方法不接受参数,返回一个标志,指示执行是否成功。如果标志未定义,则表示执行失败。

示例:

$ret_val = $sth->execute();
if (!defined($ret_val))
{
    print "Execution Failed\n";
    $dbh->disconnect();
    exit 0;
}
3.5 返回数据

在语句准备和执行后,使用 dump_results() 方法将数据检索并显示在标准输出上。该方法返回打印的行数,可接受参数指定输出文件和格式。

示例:

$sth->dump_results();
3.6 关闭连接

最后,使用 disconnect() 方法断开与数据库的连接:

$dbh->disconnect();
4. 执行方法

除了使用 prepare() execute() 方法,Perl DBI 还提供了 do() 方法,可一步完成语句的准备和执行。

do() 方法通过数据库句柄调用,接受一个参数,即要执行的 SQL 语句,返回一个标志,指示执行是否成功。该方法不返回数据源的数据,因此不适用于执行 SELECT 语句,但适用于 INSERT DELETE UPDATE 等不返回数据的 SQL 语句。

以下是一个示例程序:

#!/usr/bin/perl -w -T
use DBI;
sub sqlExec
{
    my ($cmd) = @_;
    my $dbh;
    my $sth;
    my $ret_val;
    my $data;
    my @rawResults;
    $dbh = DBI->connect( 'DBI:mysql:baseball',
                         'mylogin',
                         'mypassword' );
    if ( !defined($dbh) )
    {
        print "Cannot connect to database.\n";
        exit 1;
    }
    if (lc(substr($cmd, 0, 6)) ne "select")
    {
        # 如果不是 SELECT 语句,使用 do 方法
        $ret_val = $dbh->do($cmd);
        $dbh->disconnect();
        if (!defined ($ret_val))
        {
            print ("Execution of non-SELECT statement failed.\n");
            exit 1;
        }
        else
        {
            return;
        }
    }
    else
    {
        # 如果是 SELECT 语句,准备并执行
        $sth = $dbh->prepare($cmd);
        if (!defined($sth))
        {
            $dbh->disconnect();
            print ("Preparation of SELECT statement failed\n");
            exit 1;
        }
        $ret_val = $sth->execute();
        if (!defined($ret_val))
        {
            $dbh->disconnect();
            print ("Execution of SELECT statement failed\n");
            exit 1;
        }
        while ( $data = $sth->fetchrow_arrayref() )
        {
            push @rawResults, [ @$data ];
        }
        $dbh->disconnect();
        return \@rawResults;
    }
}
# 主程序
{
    my $cmd;
    my $i;
    my $results;
    sqlExec ("CREATE TABLE mytmp (aval int)");
    for ( $i = 0 ; $i < 5 ; $i++ )
    {
        sqlExec ("INSERT INTO mytmp values( $i )");
    }
    $results = sqlExec ("SELECT aval FROM mytmp ORDER BY aval");
    for ( $i = 1 ; $i < @$results ; $i++ )
    {
        my ($aval) = @{ $$results[$i] };
        print $aval . "\n";
    }
    sqlExec ("DROP TABLE mytmp");
    exit 0;
}

该程序根据 SQL 语句是否包含 SELECT 关键字,选择使用 do() 方法或 prepare() execute() 方法执行语句。

5. NULL 数据处理

与 ODBC 和 JDBC 不同,Perl DBI 可以轻松处理 NULL 数据。在 Perl 中,可通过测试变量是否已定义来判断其是否为 NULL。

以下是一个处理 NULL 数据的示例:

    $results = sqlExec ("SELECT  DISTINCT team.team_name, game.home_team " .
                        "FROM team " .
                        "LEFT JOIN game ON team.team_name = game.home_team " .
                        "WHERE city = 'Chicago' " .
                        "ORDER BY team_name");
    for ( $i = 0 ; $i < @$results ; $i++ )
    {
        my ($team_name, $home_team) = @{ $$results[$i] };
        if (defined ($home_team))
        {
            print $team_name . "\t" . $home_team . "\n";
        }
        else
        {
            print $team_name . "\tNO RECORD IN TABLE GAME'\n";
        }
    }

当执行该程序时,会根据 home_team 是否定义输出不同结果。

6. 绑定参数

Perl DBI 允许像 ODBC 和 JDBC 一样,将参数绑定到 SQL 语句中的位置。

要绑定参数,需在 SQL 语句中要绑定参数的位置放置 ? ,然后使用 bind_param() 方法将变量绑定到 ? 上。 bind_param() 方法接受两个参数:
- 第一个参数是 ? 在 SQL 语句中的从左到右的编号,从 1 开始计数。
- 第二个参数是要绑定到该 ? 的变量名。

以下是一个绑定参数的示例程序:

#!/usr/bin/perl -w -T
use DBI;
{
    my $dbh;
    my $sth;
    my $restype;
    my $ret_val;
    my $data;
    my @rawResults;
    my $cmd;
    my $cityName;
    my $teamName;
    my $i;
    $dbh = DBI->connect('DBI:mysql:baseball',
                         'mylogin',
                         'mypassword' );
    if ( !defined($dbh) )
    {
        print "Cannot connect to database.\n";
        exit 1;
    }
    $sth = $dbh->prepare("SELECT team_name FROM team WHERE city = ? ");
    if (!defined($sth))
    {
        $dbh->disconnect();
        print ("Preparation of SELECT statement failed\n");
        exit 1;
    }
    $sth->bind_param ( 1, $cityName );
    while (1)
    {
        print "Enter a city name: ";
        $|++;
        $cityName = <STDIN>;
        chomp ($cityName);
        if (lc ($cityName) eq 'quit')
        {
            $dbh->disconnect();
            print "Goodbye\n";
            exit 0;
        }
        $ret_val = $sth->execute();
        if (!defined($ret_val))
        {
            print ("Execution of SELECT statement failed\n");
            next;
        }
        while ( $data = $sth->fetchrow_arrayref() )
        {
            push @rawResults, [ @$data ];
        }
        if (@rawResults == 0)
        {
            print ($cityName . " has no team.\n");
            next;
        }
        for ( $i = 0 ; $i < @rawResults ; $i++ )
        {
            my ($team_name) = @{ $rawResults[$i] };
            print $team_name . "\n";
        }
        undef @rawResults;
    }
}

该程序提示用户输入城市名称,然后打印该城市的棒球队名称(如果有)。

7. 事务处理

Perl DBI 定义了执行事务的方法,但由于 MySQL 不支持事务,这里无法给出具体示例。不过,事务处理的概念很容易理解。

数据库对象的 AutoCommit 属性可设置数据库是否自动提交 SQL 语句的输出。默认情况下,该属性设置为 1(开启)。要关闭自动提交,可使用以下语句:

$dbh->AutoCommit = 0;

如果数据库支持事务,且 AutoCommit 设置为关闭,则可以使用 commit() rollback() 方法分别提交或回滚自上次提交数据以来执行的所有 SQL 语句的效果。

例如:

$dbh->commit();
$dbh->rollback();

断开与数据库的连接会自动提交所有未提交的数据。

8. 元数据处理

元数据是描述数据组织方式的数据。Perl DBI 提供的元数据不如 ODBC 和 JDBC 丰富,但可以通过 DBI 的数据库和语句对象的属性和方法直接访问元数据。

8.1 数据库元数据

Perl DBI 提供了两个主要方法来获取数据库元数据: tables() table_info()
- tables() 方法返回一个数组,包含数据库中所有表的名称。
- table_info() 方法返回一个语句句柄,用于检索数据库中每个表的详细信息。返回的每一行有五列:
- qualifier :表的限定符标识符,大多数情况下为 NULL。
- owner :表的所有者名称。
- name :表的名称。
- type :表的类型,如 TABLE VIEW SYSTEMTABLE ALIAS
- remarks :关于表的杂项备注。

以下是一个使用数据库元数据的示例程序:

#!/usr/bin/perl -w -T
use DBI;
{
    my $dbh;
    my @tables;
    my $sth;
    my $i;
    my $tQualifier;
    my $tOwner;
    my $tName;
    my $tType;
    my $tRemarks;
    $dbh = DBI->connect( 'DBI:mysql:baseball',
                         'mylogin',
                         'mypassword' );
    if ( !defined($dbh) )
    {
        print "Cannot connect to database.\n";
        exit 1;
    }
    # 演示 tables() 方法
    @tables = $dbh->tables();
    foreach $tName ( @tables )
    {
        print "Table: $tName\n";
    }
    # 演示 table_info() 方法
    $sth = $dbh->table_info();
    print "\nQualifier\tOwner\tName\tType\tRemarks\n";
    while ( ( $tQualifier,
              $tOwner,
              $tName,
              $tType,
              $tRemarks ) = $sth->fetchrow_array() )
    {
        foreach ($tQualifier, $tOwner, $tName, $tType, $tRemarks)
        {
            if (defined ($_))
            {
                print $_ . "\t";
            }
            else
            {
                print "N/A\t";
            }
        }
        print "\n";
    }
    $dbh->disconnect();
    exit 0;
}

当运行该程序时,会输出数据库中表的名称和详细信息。

8.2 语句元数据

语句元数据描述正在执行的语句以及执行语句后返回的数据集。语句元数据存储在语句对象的属性中,可在语句准备和执行后读取,但在读取完数据集或调用 finish() 方法后,语句元数据将无法再读取。

一些重要的语句元数据属性包括:
- NUM_OF_FIELDS :语句返回的数据集中的列数。
- NAME :一个数组,包含语句返回的数据集中每列的名称。
- PRECISION :一个数组,给出语句返回的数据集中每列的字节大小。
- NULLABLE :一个数组,为语句返回的数据集中的每列提供一个标志,指示该列是否可以包含 NULL 值。

以下是一个使用语句元数据实现简单 SQL 解释器的示例程序:

#!/usr/bin/perl -w -T
use DBI;
{
    my $dbh;
    my $sth;
    my $cmd;
    my $ret_val;
    my @column_width;
    my $data;
    my $i;
    $dbh = DBI->connect( 'DBI:mysql:baseball',
                         'mylogin',
                         'mypassword' );
    if ( !defined($dbh) )
    {
        print "Cannot connect to database.\n";
        exit 1;
    }
    while (1)
    {
        print "\nOk> ";
        $|++;
        $cmd = <STDIN>;
        chomp ($cmd);
        if (lc ($cmd) eq 'quit')
        {
            $dbh->disconnect();
            print "Goodbye\n";
            exit 0;
        }
        if (lc(substr($cmd, 0, 6)) ne "select")
        {
            # 如果不是 SELECT 语句,使用 do 方法
            $ret_val = $dbh->do($cmd);
            if (!defined ($ret_val))
            {
                print ("Execution of non-SELECT statement failed.\n");
                exit 1;
            }
            else
            {
                print "Non-SELECT statement affected " .
                      $sth->rows .
                      " rows in the database.\n";
                next;
            }
        }
        else
        {
            # 如果是 SELECT 语句,准备并执行
            $sth = $dbh->prepare($cmd);
            if (!defined($sth))
            {
                $dbh->disconnect();
                print ("Preparation of SELECT statement failed\n");
                exit 1;
            }
            $ret_val = $sth->execute();
            if (!defined($ret_val))
            {
                $dbh->disconnect();
                print ("Execution of SELECT statement failed\n");
                exit 1;
            }
            for ($i = 0 ; $i < $sth->{NUM_OF_FIELDS} ; $i++)
            {
                if ( length($sth->{NAME}->[$i]) > $sth->{PRECISION}->[$i] )
                {
                    $column_width[$i] = length ($sth->{NAME}->[$i]) + 1;
                }
                else
                {
                    $column_width[$i] = $sth->{PRECISION}->[$i] + 1;
                }
            }
            for ($i = 0 ; $i < @column_width ; $i++)
            {
                printf "%-" . $column_width[$i] . "s",
                        $sth->{NAME}->[$i];
            }
            print "\n";
            while ( $data = $sth->fetchrow_arrayref() )
            {
                for ($i = 0 ; $i < @column_width ; $i++)
                {
                    printf "%-" . $column_width[$i] . "s",
                           $data->[$i];
                }
                print "\n";
            }
            undef @column_width;
        }
    }
    $dbh->disconnect();
    exit 0;
}

该程序的结构如下:
1. 连接到数据库并获取数据库对象的句柄。
2. 提示用户输入 SQL 语句并记录。
3. 准备并执行用户输入的 SQL 语句。
4. 使用语句元数据布局语句返回的数据。
5. 打印语句返回的数据。

通过以上内容,我们详细介绍了 Perl DBI 的安装、配置、使用方法,包括连接数据库、执行 SQL 语句、处理 NULL 数据、绑定参数、事务处理和元数据处理等方面。希望这些内容能帮助你更好地使用 Perl DBI 进行数据库操作。

Perl DBI 驱动安装、配置与使用指南

9. 操作流程总结与对比

为了更清晰地展示 Perl DBI 操作的各个环节,下面通过表格和流程图进行总结,并与其他数据库接口进行简单对比。

9.1 主要操作方法对比
操作 Perl DBI 方法 说明 适用语句类型
连接数据库 DBI->connect() 打开与数据源的连接,返回数据库句柄 所有操作前必须执行
准备语句 prepare() 为 SQL 语句分配资源,检查语句正确性,返回语句句柄 所有 SQL 语句
执行语句 execute() 执行准备好的 SQL 语句,返回执行结果标志 所有 SQL 语句
一步执行 do() 一步完成语句的准备和执行,不返回数据 SELECT 语句
获取数据 dump_results() fetchrow_arrayref() 从数据源检索数据 SELECT 语句
断开连接 disconnect() 断开与数据库的连接 操作结束时执行
9.2 操作流程 mermaid 流程图
graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px;

    A([开始]):::startend --> B(加载 DBI 包):::process
    B --> C(连接数据库):::process
    C --> D{是否为 SELECT 语句}:::decision
    D -- 是 --> E(准备 SELECT 语句):::process
    E --> F(执行 SELECT 语句):::process
    F --> G(获取数据):::process
    D -- 否 --> H(使用 do 方法执行语句):::process
    G --> I(处理数据):::process
    H --> I
    I --> J(断开数据库连接):::process
    J --> K([结束]):::startend
10. 常见问题及解决方法

在使用 Perl DBI 过程中,可能会遇到一些常见问题,下面为你列举并提供解决方法。

10.1 连接数据库失败
  • 问题描述 :调用 DBI->connect() 方法时返回未定义的句柄,提示无法连接数据库。
  • 可能原因
  • 数据库服务未启动。
  • 用户名、密码错误。
  • 数据源名称配置错误。
  • 数据库端口未开放。
  • 解决方法
  • 检查数据库服务状态,确保其正常运行。
  • 核实用户名和密码是否正确。
  • 检查数据源名称的配置,包括驱动名称、数据库名称等。
  • 检查防火墙设置,确保数据库端口开放。
10.2 语句准备或执行失败
  • 问题描述 :调用 prepare() execute() 方法时返回未定义的值,提示准备或执行失败。
  • 可能原因
  • SQL 语句语法错误。
  • 数据库权限不足。
  • 数据库资源不足。
  • 解决方法
  • 仔细检查 SQL 语句的语法,可在数据库管理工具中测试。
  • 检查数据库用户的权限,确保具有执行该语句的权限。
  • 查看数据库的资源使用情况,如内存、磁盘空间等,必要时进行清理或扩容。
10.3 数据获取异常
  • 问题描述 :使用 dump_results() fetchrow_arrayref() 方法时无法获取到正确的数据。
  • 可能原因
  • SQL 语句返回结果为空。
  • 数据类型不匹配。
  • 数据编码问题。
  • 解决方法
  • 检查 SQL 语句的逻辑,确保能返回预期的数据。
  • 核实数据类型,确保程序能正确处理。
  • 检查数据库和程序的字符编码设置,确保一致。
11. 性能优化建议

为了提高 Perl DBI 程序的性能,可参考以下建议。

11.1 合理使用连接池

频繁地打开和关闭数据库连接会消耗大量资源,可使用连接池来管理数据库连接。连接池可以预先创建一定数量的连接,当需要使用时从池中获取,使用完毕后归还,避免了频繁创建和销毁连接的开销。

11.2 批量处理数据

对于大量数据的插入、更新或删除操作,可采用批量处理的方式。例如,将多个 SQL 语句合并成一个批量操作,减少与数据库的交互次数,提高效率。

# 批量插入示例
my @data = (
    [1, 'value1'],
    [2, 'value2'],
    [3, 'value3']
);

my $sth = $dbh->prepare("INSERT INTO mytable (id, value) VALUES (?, ?)");
foreach my $row (@data) {
    $sth->execute(@$row);
}
11.3 优化 SQL 语句

编写高效的 SQL 语句是提高性能的关键。避免使用复杂的子查询和不必要的排序,合理使用索引,可显著提高查询速度。

12. 总结与展望

通过本文的介绍,我们全面了解了 Perl DBI 的安装、配置和使用方法,包括连接数据库、执行 SQL 语句、处理 NULL 数据、绑定参数、事务处理和元数据处理等方面。同时,我们还总结了操作流程,分析了常见问题及解决方法,并给出了性能优化建议。

虽然 Perl DBI 提供了丰富的功能和灵活的操作方式,但目前其元数据支持相对有限。未来,随着技术的发展,我们期待 Perl DBI 能提供更丰富的元数据信息,以及更多便捷的操作方法,进一步提升开发者的使用体验。

希望本文能帮助你更好地掌握 Perl DBI,在实际项目中发挥其优势,实现高效的数据库操作。如果你在使用过程中遇到任何问题,欢迎留言讨论。

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化训练,到执行分类及结果优化的完整流程,并介绍了精度评价通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置结果后处理环节,充分利用ENVI Modeler进行自动化建模参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略效果评估体系,涵盖当前企业传播面临的预算、资源、内容效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放GEO优化,提升品牌在AI搜索中的权威性可见性;④通过数据驱动评估体系量化品牌影响力销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析工具指南进行系统学习,重点关注媒体适配性策略GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值