CAST 和 CONVERT (Transact-SQL)

CAST 和 CONVERT (Transact-SQL)

SQL Server 2012
1(共 1)对本文的评价是有帮助 评价此主题

在 SQL Server 2012 中将表达式由一种数据类型转换为另一种数据类型。

主题链接图标 Transact-SQL 语法约定

Syntax for CAST:
CAST ( expression AS data_type [ ( length ) ] )
Syntax for CONVERT:
CONVERT ( data_type [ ( length ) ] , expression [ , style ] )
expression

任何有效的表达式

data_type

目标数据类型。 这包括 xmlbigint 和 sql_variant 不能使用别名数据类型。

length

指定目标数据类型长度的可选整数。 默认值为 30。

style

指定 CONVERT 函数如何转换 expression 的整数表达式。 如果样式为 NULL,则返回 NULL。 该范围是由 data_type 确定的。 有关详细信息,请参阅“备注”部分。

返回转换为 data_type 的 expression

Date 和 Time 样式

如果 expression 为 date 或 time 数据类型,则 style 可以为下表中显示的值之一。 其他值作为 0 进行处理。 SQL Server 使用科威特算法来支持阿拉伯样式的日期格式。

不带世纪数位 (yy) (1)

带世纪数位 (yyyy)

标准

输入/输出 (3)

-

0 或1001、2

默认

mon dd yyyy hh:miAM(或 PM)

1

101

美国

mm/dd/yyyy

2

102

ANSI

yy.mm.dd

3

103

英国/法国

dd/mm/yyyy

4

104

德语

dd.mm.yy

5

105

意大利语

dd-mm-yy

6

106 (1)

-

dd mon yy

7

107 (1)

-

Mon dd, yy

8

108

-

hh:mi:ss

-

9 或1091、2

默认格式 + 毫秒

mon dd yyyy hh:mi:ss:mmmAM(或 PM)

10

110

美国

mm-dd-yy

11

111

日本

yy/mm/dd

12

112

ISO

yymmdd

yyyymmdd

-

13 或1131、2

欧洲默认格式 + 毫秒

dd mon yyyy hh:mi:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20 或 120 (2)

ODBC 规范

yyyy-mm-dd hh:mi:ss(24h)

-

21 或 121 (2)

ODBC 规范(带毫秒)

yyyy-mm-dd hh:mi:ss.mmm(24h)

-

126 (4)

ISO8601

yyyy-mm-ddThh:mi:ss.mmm(无空格)

注意 注意

毫秒 (mmm) 的值为 0 时,不显示毫秒值。 例如,值“2012-11-07T18:26:20.000”显示为“2012-11-07T18:26:20”。

-

127(6, 7)

带时区 Z 的 ISO8601。

yyyy-mm-ddThh:mi:ss.mmmZ(无空格)

注意 注意

毫秒 (mmm) 的值为 0 时,不显示毫秒值。 例如,值“2012-11-07T18:26:20.000”显示为“2012-11-07T18:26:20”。

-

130 (1,2)

回历 (5)

dd mon yyyy hh:mi:ss:mmmAM

-

131 (2)

回历 (5)

dd/mm/yy hh:mi:ss:mmmAM

1 这些样式值返回不确定的结果。 包括所有 (yy)(不带世纪数位)样式和一部分 (yyyy)(带世纪数位)样式。

2 默认值(style0 或 1009 或 10913 或 11320 或 120 以及 21 或 121)始终返回世纪数位 (yyyy)。

3 转换为 datetime 时输入;转换为字符数据时输出。

4 为用于 XML 而设计。 对于从 datetime 或 smalldatetime 到字符数据的转换,其输出格式如上一个表所述。

5 回历是有多种变体的日历系统。 SQL Server 使用科威特算法。

重要说明 重要提示

默认情况下,SQL Server 基于截止年份 2049 年来解释两位数的年份。 换言之,就是将两位数的年份 49 解释为 2049,将两位数的年份 50 解释为 1950。许多客户端应用程序(如基于自动化对象的应用程序)都使用截止年份 2030 年。 SQL Server 提供了 two digit year cutoff 配置选项以更改 SQL Server 使用的截止年份,从而进行一致的日期处理。 建议您指定四位数年份。

6 仅支持从字符数据转换为 datetime 或 smalldatetime。 仅表示日期或时间成分的字符数据转换为 datetime 或 smalldatetime 数据类型时,未指定的时间成分设置为 00:00:00.000,未指定的日期成分设置为 1900-01-01。

7使用可选的时间区域指示符 (Z) 更便于将具有时区信息的 XML datetime 值映射到没有时区的 SQL Server datetime 值。 Z 是时区 UTC-0 的指示符。 其他时区则以 + 或 - 方向的 HH:MM 偏移量来指示。 例如:2006-12-12T23:45:12-08:00

从 smalldatetime 转换为字符数据时,包含秒或毫秒的样式将在这些位置上显示零。 使用相应的 char 或 varchar 数据类型长度从 datetime 或smalldatetime 值转换时,可截断不需要的日期部分。

从样式包含时间的字符数据转换为 datetimeoffset 时,将在结果末尾追加时区偏移量。

float 和 real 样式

如果 expression 为 float 或 real,则 style 可以为下表中显示的值之一。 其他值作为 0 进行处理。

输出

0(默认值)

最多包含 6 位。 根据需要使用科学记数法。

1

始终为 8 位值。 始终使用科学记数法。

2

始终为 16 位值。 始终使用科学记数法。

126, 128, 129

为了保持向后兼容而包括在内,在以后的版本中可能不推荐使用。

money 和 smallmoney 样式

如果 expression 为 money 或 smallmoney,则 style 可以为下表中显示的值之一。 其他值作为 0 进行处理。

输出

0(默认值)

小数点左侧每三位数字之间不以逗号分隔,小数点右侧取两位数,例如 4235.98。

1

小数点左侧每三位数字之间以逗号分隔,小数点右侧取两位数,例如 3,510.92。

2

小数点左侧每三位数字之间不以逗号分隔,小数点右侧取四位数,例如 4235.9819。

126

转换为 char(n) 或 varchar(n) 时,等同于样式 2

xml 样式

如果 expression 为 xml,则 style 可以为下表中显示的值之一。 其他值作为 0 进行处理。

输出

0(默认值)

使用默认的分析行为,即放弃无用的空格,且不允许使用内部 DTD 子集。

注意 注意

转换为 xml 数据类型时,SQL Server 的无用空格处理方式不同于 XML 1.0。 有关详细信息,请参阅创建 XML 数据的实例

1

保留无用空格。 此样式设置将默认的 xml:space 处理方式设置为与指定了 xml:space="preserve" 的行为相同。

2

启用有限的内部 DTD 子集处理。

如果启用,则服务器可使用内部 DTD 子集提供的以下信息来执行非验证分析操作。

  • 应用属性的默认值。

  • 解析并扩展内部实体引用。

  • 检查 DTD 内容模型以实现语法的正确性。

分析器将忽略外部 DTD 子集。 此外,不评估 XML 声明来查看 standalone 属性是设置为 yes 还是 no,而是将 XML 实例当成一个独立文档进行分析。

3

保留无用空格,并启用有限的内部 DTD 子集处理。

二进制样式

如果 expression 为 binary(n)varbinary(n)char(n) 或 varchar(n),则 style 可以为下表中显示的值之一。 表中没有列出的样式值将返回错误。

输出

0(默认值)

将 ASCII 字符转换为二进制字节,或者将二进制字节转换为 ASCII 字符。 每个字符或字节按照 1:1 进行转换。

如果 data_type 为二进制类型,则会在结果左侧添加字符 0x。

1, 2

如果 data_type 为二进制类型,则表达式必须为字符表达式。 expression 必须由数量为偶数的十六进制数字(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、a、b、c、d、e、f)组成。 如果将 style 设置为 1,字符 0x 必须为表达式中的前两个字符。 如果表达式中包含的字符数为奇数或者包含任何无效的字符,则会引发错误。

如果转换后的表达式长度大于 data_type 长度,则会在右侧截断结果。

如果固定长度 data_types 大于转换后的结果,则会在结果右侧添加零。

如果 data_type 为字符类型,则表达式必须为二进制表达式。 每个二进制字符均转换为两个十六进制字符。 如果转换后的表达式长度大于data_type长度,则会在右侧截断结果。

如果 data_type 为固定大小的字符类型,并且转换后的结果长度小于其 data_type 长度,则会在转换后的表达式右侧添加空格,以使十六进制数字的个数保持为偶数。

对于 style 1,将在转换后的结果左侧添加字符 0x。

隐式转换

隐式转换指那些没有指定 CAST 或 CONVERT 函数的转换。 显式转换指那些需要指定 CAST 或 CONVERT 函数的转换。 以下图例显示了可对 SQL Server 系统提供的数据类型执行的所有显式和隐式数据类型转换。 其中包括 xmlbigint 和 sql_variant 不存在对 sql_variant 数据类型的赋值进行的隐式转换,但是存在转换为 sql_variant 的隐式转换。

提示 提示

此图表可从 Microsoft 下载中心作为 PDF 文件下载。

数据类型转换表

在 datetimeoffset 与字符类型 charvarcharnchar 和 nvarchar 之间转换时,转换后的时区偏移量部分的 HH 和 MM 都应始终为两个数字,例如 -08:00。

注意 注意

因为 Unicode 数据始终使用偶数个字节,所以在 binary 或 varbinary 与支持 Unicode 的数据类型之间进行转换时会使用警告。 例如,以下转换不返回十六进制值 41;而是返回 4100:SELECT CAST(CAST(0x41 AS nvarchar) AS varbinary)

大值数据类型

大值数据类型表现出与小值数据类型相同的隐式和显式转换行为,特别是 varcharnvarchar 和 varbinary 数据类型。 但是,应该考虑以下原则:

  • 从 image 到 varbinary(max) 的转换与反向转换是隐式转换,text 与 varchar(max)ntextnvarchar(max) 之间的转换也是隐式转换。

  • 从大值数据类型(如 varchar(max))到小值数据类型(如 varchar)的转换是隐式转换,但如果大值相对于指定长度的小值数据类型显得太大,则产生截断。

  • 从 varcharnvarchar 或 varbinary 到其相应的大值数据类型的转换都是隐式执行的。

  • 从 sql_variant 数据类型到大值数据类型的转换是显式转换。

  • 大值数据类型不能转换为 sql_variant 数据类型。

有关如何从 xml 数据类型进行转换的详细信息,请参阅创建 XML 数据的实例

xml 数据类型

当您将 xml 数据类型显式或隐式转换为字符串或二进制数据类型时,xml 数据类型的内容将根据一组规则进行序列化。 有关这些规则的信息,请参阅 定义 XML 数据的序列化 有关如何从其他数据类型转换到 xml 数据类型的信息,请参阅创建 XML 数据的实例

文本和图像数据类型

不支持对 text 和 image 数据类型进行自动数据类型转换。 可将 text 数据显式转换为字符数据,将 image 数据转换为 binary 或 varbinary,但最大长度是 8000 字节。 如果试图进行不正确的转换,如将包含字母的字符表达式转换为 int,则 SQL Server 将返回错误消息。

输出排序规则

如果 CAST 或 CONVERT 的输出是字符串,并且输入也是字符串,则输出将与输入具有相同的排序规则和排序规则标签。 如果输入不是字符串,则输出采用数据库的默认排序规则以及强制默认的排序规则标签。 有关详细信息,请参阅排序规则优先级 (Transact-SQL)

若要为输出分配不同的排序规则,请将 COLLATE 子句应用于 CAST 或 CONVERT 函数的结果表达式。 例如:

SELECT CAST('abc' AS varchar(5)) COLLATE French_CS_AS

截断结果和舍入结果

将字符或二进制表达式(charncharnvarcharvarcharbinary 或 varbinary)转换为其他数据类型的表达式时,可截断数据,仅显示部分数据,或返回错误(因为结果太短而无法显示)。 除了下表显示的转换,其他到 charvarcharncharnvarcharbinary 和 varbinary 的转换都将被截断。

被转换的数据类型

转换为的数据类型

结果

int smallint 或 tinyint

char

*

 

varchar

*

 

nchar

E

 

nvarchar

E

money smallmoneynumericdecimalfloat 或 real

char

E

 

varchar

E

 

nchar

E

 

nvarchar

E

* = 结果长度太短而无法显示。 E = 因为结果长度太短无法显示而返回错误。

SQL Server 仅保证往返转换(即从原始数据类型进行转换后又返回原始数据类型的转换)在各版本间产生相同值。 以下示例显示的即是这样的往返转换:

DECLARE @myval decimal (5, 2);
SET @myval = 193.57;
SELECT CAST(CAST(@myval AS varbinary(20)) AS decimal(10,5));
-- Or, using CONVERT
SELECT CONVERT(decimal(10,5), CONVERT(varbinary(20), @myval));
注意注意

不要尝试构造 binary 值然后将其转换为数值数据类型类别的一种数据类型。 SQL Server 不能保证 decimal 或 numeric 数据类型到 binary 的转换结果在 SQL Server 的各个版本中都相同。

以下示例显示了由于太小而无法显示的结果表达式。

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, SUBSTRING(p.Title, 1, 25) AS Title, CAST(e.SickLeaveHours AS char(1)) AS [Sick Leave]
FROM HumanResources.Employee e JOIN Person.Person p ON e.BusinessEntityID = p.BusinessEntityID
WHERE NOT e.BusinessEntityID >5;

下面是结果集:

FirstName   LastName      Title   Sick Leave

---------   ------------- ------- --------

Ken         Sanchez       NULL   *

Terri       Duffy         NULL   *

Roberto     Tamburello    NULL   *

Rob         Walters       NULL   *

Gail        Erickson      Ms.    *

(5 row(s) affected)

转换小数位数不同的数据类型时,结果值有时被截断,有时被舍入。 下表显示了此行为。

目标

行为

numeric

numeric

舍入

numeric

int

截断

numeric

money

舍入

money

int

舍入

money

numeric

舍入

float

int

截断

float

numeric

舍入

使用科学记数法将 float 值转换为 decimal 或 numeric 被限制为仅限 17 位精度的值。 精度高于 17 的任何值都将舍入为零。

float

datetime

舍入

datetime

int

舍入

例如,以下转换的结果为 10

SELECT CAST(10.6496 AS int);

在进行数据类型转换时,若目标数据类型的小数位数小于源数据类型的小数位数,则该值将被截断。 例如,以下转换的结果为 $10.3497

SELECT CAST(10.3496847 AS money);

在非数字 charncharvarchar 或 nvarchar 数据转换为 intfloatnumeric 或 decimal 时,SQL Server 将返回错误消息。 当空字符串 (" ") 转换为numeric 或 decimal 时,SQL Server 也返回错误。

在 SQL Server 2005 及更高版本中,某些 datetime 转换具有不确定性

在 SQL Server 2000 中,从 string 到 date 和 time 的转换被标记为确定性转换。 但是,这对于下表中列出的样式却不成立。 对于这些样式,相应的转换取决于语言设置。 SQL Server 2005 及更高版本将这些转换标记为不确定性转换。

下表列出了从 string 到 datetime 的转换为不确定性转换的样式。

低于 100 的所有样式1

106

107

109

113

130

1 样式 20 和 21 除外

补充字符(代理项对)

从 SQL Server 2012 开始,如果使用增补字符 (SC) 排序规则,则从 nchar 或 nvarchar 到更小长度的 nchar 或 nvarchar 类型的 CAST 操作将不会在代理项对内截断;它在补充字符前面截断。 例如,以下代码段导致 @x 仅保留 'ab' 没有足够的空间来保留补充字符。

DECLARE @x NVARCHAR(10) = 'ab' + NCHAR(0x10000);
SELECT CAST (@x AS NVARCHAR(3));

在使用 SC 排序规则时,CONVERT 行为类似于 CAST

兼容性支持

在 SQL Server 的早期版本中,对 time 或 datetime2 数据类型的 CAST 和 CONVERT 操作的默认样式为 121,当在计算列表达式中使用这些类型时除外。 对于计算列,默认样式为 0。 当创建用于涉及自动参数化的查询中或约束定义中的计算列时,此行为会影响计算列。

兼容级别为 110 时,对 time 和 datetime2 数据类型的 CAST 和 CONVERT 操作的默认样式始终为 121。 如果您的查询依赖旧行为,请使用低于 110 的兼容级别或在受影响的查询中显式指定 0 样式。

将数据库升级到兼容级别 110 将不更改已存储到磁盘的用户数据。 您必须相应手动更正此数据。 例如,如果您使用了 SELECT INTO 来从包含上述计算列表达式的源创建表,将存储数据(使用样式 0)而非存储计算列定义本身。 您需要手动更新此数据,以匹配样式 121。

A.同时使用 CAST 和 CONVERT

每个示例检索标价的第一位是 3 的产品的名称,并将其 ListPrice 转换为 int

-- Use CAST
USE AdventureWorks2012;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CAST(ListPrice AS int) LIKE '3%';
GO

-- Use CONVERT.
USE AdventureWorks2012;
GO
SELECT SUBSTRING(Name, 1, 30) AS ProductName, ListPrice
FROM Production.Product
WHERE CONVERT(int, ListPrice) LIKE '3%';
GO

B.使用包含算术运算符的 CAST

以下示例将本年度截止到现在的全部销售额 (SalesYTD) 除以佣金百分比 (CommissionPCT),从而得出单列计算结果 (Computed)。 在舍入到最接近的整数后,此结果将转换为 int 数据类型。

USE AdventureWorks2012;
GO
SELECT CAST(ROUND(SalesYTD/CommissionPCT, 0) AS int) AS Computed
FROM Sales.SalesPerson 
WHERE CommissionPCT != 0;
GO

下面是结果集:

Computed

------

379753754

346698349

257144242

176493899

281101272

0

301872549

212623750

298948202

250784119

239246890

101664220

124511336

97688107

(14 row(s) affected)

C.使用 CAST 进行连接

以下示例使用 CAST 连接非字符型非二进制表达式。

USE AdventureWorks2012;
GO
SELECT 'The list price is ' + CAST(ListPrice AS varchar(12)) AS ListPrice
FROM Production.Product
WHERE ListPrice BETWEEN 350.00 AND 400.00;
GO

下面是结果集:

ListPrice

------------------

The list price is 357.06

The list price is 364.09

The list price is 364.09

The list price is 364.09

The list price is 364.09

(5 row(s) affected)

D.使用 CAST 生成可读性更高的文本

以下示例使用选择列表中的 CAST 将 Name 列转换为 char(10) 列。

USE AdventureWorks2012;
GO
SELECT DISTINCT CAST(p.Name AS char(10)) AS Name, s.UnitPrice
FROM Sales.SalesOrderDetail AS s 
JOIN Production.Product AS p 
    ON s.ProductID = p.ProductID
WHERE Name LIKE 'Long-Sleeve Logo Jersey, M';
GO

下面是结果集:

Name       UnitPrice

---------- ---------------------

Long-Sleev 31.2437

Long-Sleev 32.4935

Long-Sleev 49.99

(3 row(s) affected)

E.将 CAST 与 LIKE 子句一起作用

以下示例将 money 列 SalesYTD 转换为 int 列,然后再转换为 char(20) 列,以便在 LIKE 子句中使用该列。

USE AdventureWorks2012;
GO
SELECT p.FirstName, p.LastName, s.SalesYTD, s.BusinessEntityID
FROM Person.Person AS p 
JOIN Sales.SalesPerson AS s 
    ON p.BusinessEntityID = s.BusinessEntityID
WHERE CAST(CAST(s.SalesYTD AS int) AS char(20)) LIKE '2%';
GO

下面是结果集:

FirstName        LastName            SalesYTD         SalesPersonID

---------------- ------------------- ---------------- -------------

Tsvi             Reiter              2811012.7151      279

Syed             Abbas               219088.8836       288

Rachel           Valdez              2241204.0424      289

(3 row(s) affected)

F.使用 CONVERT 或 CAST 以处理类型化的 XML

下面的几个示例说明如何通过 XML 数据类型和列 (SQL Server) 使用 CONVERT 转换为类型化的 XML。

此示例将包含空格、文本和标记的字符串转换为类型化的 XML,并删除所有无用空格(节点之间的边界空格):

CONVERT(XML, '<root><child/></root>')

此示例将包含空格、文本和标记的类似字符串转换为类型化的 XML,并保留无用空格(节点之间的边界空格):

CONVERT(XML, '<root>          <child/>         </root>', 1)

此示例将包含空格、文本和标记的字符串转换为类型化的 XML:

CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>'  AS XML)

有关详细信息,请参阅创建 XML 数据的实例

G.对日期时间数据使用 CAST 和 CONVERT

以下示例显示当前日期和时间,使用 CAST 将当前日期和时间更改为字符数据类型,然后使用 CONVERT 以 ISO 8901 格式显示日期和时间。

SELECT 
   GETDATE() AS UnconvertedDateTime,
   CAST(GETDATE() AS nvarchar(30)) AS UsingCast,
   CONVERT(nvarchar(30), GETDATE(), 126) AS UsingConvertTo_ISO8601  ;
GO

下面是结果集:

UnconvertedDateTime     UsingCast                      UsingConvertTo_ISO8601

----------------------- ------------------------------ ------------------------------

2006-04-18 09:58:04.570 Apr 18 2006 9:58AM            2006-04-18T09:58:04.570

(1 row(s) affected)

以下示例与上述示例几乎完全相反。 该示例将日期和时间显示为字符数据,使用 CAST 将字符数据更改为 datetime 数据类型,然后使用 CONVERT 将字符数据更改为 datetime 数据类型。

SELECT 
   '2006-04-25T15:50:59.997' AS UnconvertedText,
   CAST('2006-04-25T15:50:59.997' AS datetime) AS UsingCast,
   CONVERT(datetime, '2006-04-25T15:50:59.997', 126) AS UsingConvertFrom_ISO8601 ;
GO

下面是结果集:

UnconvertedText         UsingCast               UsingConvertFrom_ISO8601

----------------------- ----------------------- ------------------------

2006-04-25T15:50:59.997 2006-04-25 15:50:59.997 2006-04-25 15:50:59.997

(1 row(s) affected)

H.使用 CONVERT 处理二进制和字符数据

以下示例使用不同样式显示转换二进制和字符数据的结果。

--Convert the binary value 0x4E616d65 to a character value.
SELECT CONVERT(char(8), 0x4E616d65, 0) AS [Style 0, binary to character];

下面是结果集:

Style 0, binary to character

----------------------------

Name

(1 row(s) affected)

--The following example shows how Style 1 can force the result
--to be truncated. The truncation is caused by
--including the characters 0x in the result.
SELECT CONVERT(char(8), 0x4E616d65, 1) AS [Style 1, binary to character];

下面是结果集:

Style 1, binary to character

------------------------------

0x4E616D

(1 row(s) affected)

--The following example shows that Style 2 does not truncate the
--result because the characters 0x are not included in
--the result.
SELECT CONVERT(char(8), 0x4E616d65, 2) AS [Style 2, binary to character];

下面是结果集:

Style 2, binary to character

------------------------------

4E616D65

(1 row(s) affected)

--Convert the character value 'Name' to a binary value.
SELECT CONVERT(binary(8), 'Name', 0) AS [Style 0, character to binary];

下面是结果集:

Style 0, character to binary

----------------------------------

0x4E616D6500000000

(1 row(s) affected)

SELECT CONVERT(binary(4), '0x4E616D65', 1) AS [Style 1, character to binary];

下面是结果集:

Style 1, character to binary

----------------------------------

0x4E616D65

(1 row(s) affected)

SELECT CONVERT(binary(4), '4E616D65', 2) AS [Style 2, character to binary];

下面是结果集:

Style 2, character to binary

----------------------------------

0x4E616D65

(1 row(s) affected)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值