MySQL8 中文参考(二)(4)https://developer.aliyun.com/article/1566100
1.6.2 MySQL 与标准 SQL 的差异
原文:
dev.mysql.com/doc/refman/8.0/en/differences-from-ansi.html
1.6.2.1 SELECT INTO TABLE 差异
1.6.2.2 UPDATE 差异
1.6.2.3 外键约束的差异
1.6.2.4 ‘–’ 作为注释的起始
我们努力使 MySQL Server 遵循 ANSI SQL 标准和 ODBC SQL 标准,但在某些情况下,MySQL Server 的操作方式有所不同:
- MySQL 和标准 SQL 权限系统之间存在几个不同之处。例如,在 MySQL 中,当你删除一个表时,该表的权限不会自动被撤销。你必须明确地发出一个
REVOKE
语句来撤销表的权限。更多信息,请参见 Section 15.7.1.8, “REVOKE Statement”。 CAST()
函数不支持转换为REAL
- FLOAT, DOUBLE")或BIGINT
- INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT")。请参见 Section 14.10, “Cast Functions and Operators”。
原文:
dev.mysql.com/doc/refman/8.0/en/ansi-diff-select-into-table.html
1.6.2.1 SELECT INTO TABLE 差异
MySQL Server 不支持SELECT ... INTO TABLE
Sybase SQL 扩展。相反,MySQL Server 支持标准 SQL 语法INSERT INTO ... SELECT
,基本上是相同的事情。参见 Section 15.2.7.1, “INSERT … SELECT Statement”。例如:
INSERT INTO tbl_temp2 (fld_id) SELECT tbl_temp1.fld_order_id FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;
或者,您可以使用SELECT ... INTO OUTFILE
或CREATE TABLE ... SELECT
。
您可以使用带有用户定义变量的SELECT ... INTO
。相同的语法也可以在使用游标和本地变量的存储过程中使用。参见 Section 15.2.13.1, “SELECT … INTO Statement”。
1.6.2.2 UPDATE 差异
如果在表达式中访问要更新的表中的列,UPDATE
会使用列的当前值。以下语句中的第二个赋值将col2
设置为当前(更新后)的col1
值,而不是原始的col1
值。结果是col1
和col2
具有相同的值。这种行为与标准 SQL 不同。
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
原文:
dev.mysql.com/doc/refman/8.0/en/ansi-diff-foreign-keys.html
1.6.2.3 外键约束的差异
MySQL 对外键约束的实现与 SQL 标准在以下关键方面有所不同:
- 如果父表中有多行具有相同的引用键值,
InnoDB
会像其他具有相同键值的父行不存在一样执行外键检查。例如,如果定义了RESTRICT
类型的约束,并且有一个子行具有多个父行,InnoDB
不允许删除任何父行。 - 如果
ON UPDATE CASCADE
或ON UPDATE SET NULL
递归更新相同表,它会像RESTRICT
一样操作。这意味着不能使用自引用的ON UPDATE CASCADE
或ON UPDATE SET NULL
操作。这是为了防止由级联更新导致的无限循环。另一方面,自引用的ON DELETE SET NULL
是可能的,就像自引用的ON DELETE CASCADE
一样。级联操作不能嵌套超过 15 层。 - 在插入、删除或更新多行的 SQL 语句中,外键约束(如唯一约束)会逐行检查。在执行外键检查时,
InnoDB
会在必须检查的子记录或父记录上设置共享的行级锁。MySQL 会立即检查外键约束;检查不会延迟到事务提交。根据 SQL 标准,默认行为应该是延迟检查。也就是说,只有在整个 SQL 语句被处理完之后才会检查约束。这意味着不可能使用外键删除引用自身的行。 - 没有存储引擎,包括
InnoDB
,识别或执行引用完整性约束定义中使用的MATCH
子句。使用显式的MATCH
子句不会产生指定的效果,并且会导致ON DELETE
和ON UPDATE
子句被忽略。应避免指定MATCH
。
SQL 标准中的MATCH
子句控制如何处理复合(多列)外键中的NULL
值,当与引用表中的主键进行比较时。MySQL 基本上实现了MATCH SIMPLE
定义的语义,允许外键全部或部分为NULL
。在这种情况下,包含这种外键的(子表)行可以被插入,即使它与引用(父表)中的任何行都不匹配。(可以使用触发器实现其他语义。) - 出于性能原因,MySQL 要求引用的列被索引。然而,MySQL 不强制要求引用的列是
UNIQUE
或声明为NOT NULL
。
引用非UNIQUE
键的FOREIGN KEY
约束不是标准 SQL,而是InnoDB
的扩展。另一方面,NDB
存储引擎要求在任何作为外键引用的列上显式唯一键(或主键)。
对于包含非唯一键或包含NULL
值的外键引用的处理对于诸如UPDATE
或DELETE CASCADE
等操作并不明确定义。建议您使用仅引用UNIQUE
(包括PRIMARY
)和NOT NULL
键的外键。 - 对于不支持外键的存储引擎(如
MyISAM
),MySQL 服务器解析并忽略外键规范。 - MySQL 解析但忽略“内联
REFERENCES
规范”(如 SQL 标准中定义的),其中引用是作为列规范的一部分定义的。MySQL 仅在作为单独的FOREIGN KEY
规范的一部分指定时才接受REFERENCES
子句。定义一个列使用REFERENCES *tbl_name*(col_name)
子句实际上没有任何效果,仅仅作为一个备忘录或注释,告诉您当前正在定义的列意图引用另一个表中的列。在使用这种语法时,重要的是要意识到:
- MySQL 不执行任何检查以确保col_name实际存在于tbl_name中(甚至tbl_name本身是否存在)。
- MySQL 不对tbl_name执行任何操作,例如根据您定义的表中的行所采取的操作删除行;换句话说,这种语法根本不引起任何
ON DELETE
或ON UPDATE
行为。(尽管您可以将ON DELETE
或ON UPDATE
子句编写为REFERENCES
子句的一部分,但它也会被忽略。) - 这种语法创建了一个列;它不创建任何索引或键。
- 您可以将创建的列用作连接列,如下所示:
CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, name CHAR(60) NOT NULL, PRIMARY KEY (id) ); CREATE TABLE shirt ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, style ENUM('t-shirt', 'polo', 'dress') NOT NULL, color ENUM('red', 'blue', 'orange', 'white', 'black') NOT NULL, owner SMALLINT UNSIGNED NOT NULL REFERENCES person(id), PRIMARY KEY (id) ); INSERT INTO person VALUES (NULL, 'Antonio Paz'); SELECT @last := LAST_INSERT_ID(); INSERT INTO shirt VALUES (NULL, 'polo', 'blue', @last), (NULL, 'dress', 'white', @last), (NULL, 't-shirt', 'blue', @last); INSERT INTO person VALUES (NULL, 'Lilliana Angelovska'); SELECT @last := LAST_INSERT_ID(); INSERT INTO shirt VALUES (NULL, 'dress', 'orange', @last), (NULL, 'polo', 'red', @last), (NULL, 'dress', 'blue', @last), (NULL, 't-shirt', 'white', @last); SELECT * FROM person; +----+---------------------+ | id | name | +----+---------------------+ | 1 | Antonio Paz | | 2 | Lilliana Angelovska | +----+---------------------+ SELECT * FROM shirt; +----+---------+--------+-------+ | id | style | color | owner | +----+---------+--------+-------+ | 1 | polo | blue | 1 | | 2 | dress | white | 1 | | 3 | t-shirt | blue | 1 | | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | | 7 | t-shirt | white | 2 | +----+---------+--------+-------+ SELECT s.* FROM person p INNER JOIN shirt s ON s.owner = p.id WHERE p.name LIKE 'Lilliana%' AND s.color <> 'white'; +----+-------+--------+-------+ | id | style | color | owner | +----+-------+--------+-------+ | 4 | dress | orange | 2 | | 5 | polo | red | 2 | | 6 | dress | blue | 2 | +----+-------+--------+-------+
- 当以这种方式使用时,
REFERENCES
子句不会显示在SHOW CREATE TABLE
或DESCRIBE
的输出中:
SHOW CREATE TABLE shirt\G *************************** 1\. row *************************** Table: shirt Create Table: CREATE TABLE `shirt` ( `id` smallint(5) unsigned NOT NULL auto_increment, `style` enum('t-shirt','polo','dress') NOT NULL, `color` enum('red','blue','orange','white','black') NOT NULL, `owner` smallint(5) unsigned NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
有关外键约束的信息,请参阅第 15.1.20.5 节,“FOREIGN KEY Constraints”。
1.6.2.4 '--'
作为注释的起始
标准 SQL 使用 C 语法/* 这是一个注释 */
作为注释,MySQL 服务器也支持这种语法。MySQL 还支持这种语法的扩展,允许将 MySQL 特定的 SQL 嵌入到注释中;参见第 11.7 节,“注释”。
MySQL 服务器还使用#
作为起始注释字符。这是非标准的。
标准 SQL 还使用“--
”作为起始注释序列。MySQL 服务器支持--
注释风格的变体;--
起始注释序列被接受为这样,但必须跟随一个空格字符,如空格或换行符。这个空格旨在防止生成的 SQL 查询出现问题,使用以下结构,更新余额以反映一个费用:
UPDATE account SET balance=balance-charge WHERE account_id=user_id
当charge
为负值时会发生什么,比如-1
,这可能是在向账户存入金额时的情况。在这种情况下,生成的语句如下:
UPDATE account SET balance=balance--1 WHERE account_id=5752;
balance--1
是有效的标准 SQL,但--
被解释为注释的起始,并且表达式的一部分被丢弃。结果是语句的含义完全不同于预期:
UPDATE account SET balance=balance WHERE account_id=5752;
这个语句根本不会改变值。为了防止这种情况发生,MySQL 要求在--
后面跟随一个空格字符,以便在 MySQL 服务器中被识别为起始注释序列,这样像balance--1
这样的表达式总是安全的使用。
1.6.3 MySQL 如何处理约束
1.6.3.1 主键和唯一索引约束
1.6.3.2 外键约束
1.6.3.3 对无效数据强制执行的约束
1.6.3.4 枚举和集合约束
MySQL 允许您同时使用允许回滚的事务表和不允许回滚的非事务表。因此,在 MySQL 中,约束处理与其他数据库管理系统有些不同。当在非事务表中插入或更新了大量行且发生错误时,无法回滚更改时,我们必须处理这种情况。
基本理念是,MySQL 服务器尝试为解析要执行的语句中可以检测到的任何内容生成错误,并尝试从执行语句时发生的任何错误中恢复。在大多数情况下,我们会这样做,但还不是全部。
当 MySQL 发生错误时,其选项包括停止语句执行或尽可能从问题中恢复并继续。默认情况下,服务器遵循后一种方式。这意味着,例如,服务器可能会将无效值强制转换为最接近的有效值。
有几个 SQL 模式选项可用于更好地控制处理不良数据值的方式以及在发生错误时是否继续语句执行或中止。使用这些选项,您可以配置 MySQL 服务器以更传统的方式运行,类似于其他拒绝不当输入的数据库管理系统。SQL 模式可以在服务器启动时全局设置以影响所有客户端。各个客户端可以在运行时设置 SQL 模式,从而使每个客户端选择最适合其需求的行为。请参阅 第 7.1.11 节,“服务器 SQL 模式”。
以下各节描述了 MySQL 服务器如何处理不同类型的约束。
原文:
dev.mysql.com/doc/refman/8.0/en/constraint-primary-key.html
1.6.3.1 主键和唯一索引约束
通常,数据更改语句(如 INSERT
或 UPDATE
)可能违反主键、唯一键或外键约束而导致错误。如果你使用事务性存储引擎如 InnoDB
,MySQL 会自动回滚该语句。如果你使用非事务性存储引擎,MySQL 会在发生错误的行处停止处理该语句,并留下任何未处理的行。
MySQL 支持 IGNORE
关键字用于 INSERT
、UPDATE
等语句。如果使用它,MySQL 会忽略主键或唯一键违规,并继续处理下一行。请参阅你正在使用的语句的部分(15.2.7 “INSERT Statement”,15.2.17 “UPDATE Statement” 等)。
你可以使用 mysql_info()
C API 函数获取实际插入或更新的行数信息。你也可以使用 SHOW WARNINGS
语句。参见 mysql_info(),以及 15.7.7.42 “SHOW WARNINGS Statement”。
InnoDB
和 NDB
表支持外键。参见 1.6.3.2 “外键约束”。
原文:
dev.mysql.com/doc/refman/8.0/en/constraint-foreign-key.html
1.6.3.2 外键约束
外键允许您在表之间交叉引用相关数据,而外键约束有助于保持这些分散的数据一致。
MySQL 支持在CREATE TABLE
和ALTER TABLE
语句中的ON UPDATE
和ON DELETE
外键引用。可用的引用操作包括RESTRICT
、CASCADE
、SET NULL
和NO ACTION
(默认)。
MySQL 服务器也支持SET DEFAULT
,但当前被InnoDB
拒绝为无效。由于 MySQL 不支持延迟约束检查,NO ACTION
被视为RESTRICT
。有关 MySQL 支持的外键的确切语法,请参见 Section 15.1.20.5, “FOREIGN KEY Constraints”。
MATCH FULL
、MATCH PARTIAL
和MATCH SIMPLE
是允许的,但应避免使用,因为它们会导致 MySQL 服务器忽略同一语句中使用的任何ON DELETE
或ON UPDATE
子句。MATCH
选项在 MySQL 中没有其他效果,实际上全天候强制执行MATCH SIMPLE
语义。
MySQL 要求外键列被索引;如果您创建了一个具有外键约束但在给定列上没有索引的表,将会创建一个索引。
你可以从信息模式KEY_COLUMN_USAGE
表中获取有关外键的信息。这里展示了针对该表的查询示例:
mysql> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME > FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE > WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL; +--------------+---------------+-------------+-----------------+ | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | +--------------+---------------+-------------+-----------------+ | fk1 | myuser | myuser_id | f | | fk1 | product_order | customer_id | f2 | | fk1 | product_order | product_id | f1 | +--------------+---------------+-------------+-----------------+ 3 rows in set (0.01 sec)
有关InnoDB
表上外键的信息也可以在INFORMATION_SCHEMA
数据库中的INNODB_FOREIGN
和INNODB_FOREIGN_COLS
表中找到。
InnoDB
和NDB
表支持外键。
原文:
dev.mysql.com/doc/refman/8.0/en/constraint-invalid-data.html
1.6.3.3 对无效数据的强制约束
默认情况下,MySQL 8.0 会拒绝无效或不当的数据值,并中止出现这些值的语句。可以通过禁用严格的 SQL 模式(参见第 7.1.11 节,“服务器 SQL 模式”)来改变这种行为,使服务器将其强制转换为有效值以便进行数据输入,但这并不推荐。
旧版本的 MySQL 默认采用宽容的行为;有关此行为的描述,请参阅对无效数据的约束。
1.6.3.4 ENUM 和 SET 约束
ENUM
和SET
列提供了一种有效的方式来定义只能包含给定一组值的列。请参阅第 13.3.5 节,“ENUM 类型”和第 13.3.6 节,“SET 类型”。
除非禁用严格模式(不建议,但请参阅第 7.1.11 节,“服务器 SQL 模式”),否则ENUM
或SET
列的定义将作为对输入到列中的值的约束。对于不满足这些条件的值会发生错误:
ENUM
值必须是列定义中列出的值之一,或其内部数值等效项。该值不能是错误值(即0
或空字符串)。对于定义为ENUM('a','b','c')
的列,诸如''
,'d'
或'ax'
之类的值是无效的并将被拒绝。SET
值必须是空字符串或仅由列定义中以逗号分隔的值组成。对于定义为SET('a','b','c')
的列,诸如'd'
或'a,b,c,d'
之类的值是无效的并将被拒绝。
如果在严格模式下使用INSERT IGNORE
或UPDATE IGNORE
,可以抑制无效值的错误。在这种情况下,将生成警告而不是错误。对于ENUM
,该值将作为错误成员(0
)插入。对于SET
,该值将按原样插入,除非删除任何无效的子字符串。例如,'a,x,b,y'
的结果是'a,b'
。
第二章 安装 MySQL
目录
2.1 一般安装指导
2.1.1 支持的平台
2.1.2 安装哪个 MySQL 版本和发行版
2.1.3 如何获取 MySQL
2.1.4 使用 MD5 校验和或 GnuPG 验证软件包完整性
2.1.5 安装布局
2.1.6 编译器特定的构建特性
2.2 在 Unix/Linux 上使用通用二进制文件安装 MySQL
2.3 在 Microsoft Windows 上安装 MySQL
2.3.1 Microsoft Windows 上的 MySQL 安装布局
2.3.2 选择安装包
2.3.3 Windows 的 MySQL 安装程序
2.3.4 使用 noinstall
ZIP 存档在 Microsoft Windows 上安装 MySQL
2.3.5 解决 Microsoft Windows 上 MySQL 服务器安装问题
2.3.6 Windows 安装后的程序
2.3.7 Windows 平台限制
2.4 在 macOS 上安装 MySQL
2.4.1 在 macOS 上安装 MySQL 的一般注意事项
2.4.2 使用本地软件包在 macOS 上安装 MySQL
2.4.3 安装和使用 MySQL 启动守护程序
2.4.4 安装和使用 MySQL 首选项窗格
2.5 在 Linux 上安装 MySQL
2.5.1 在 Linux 上使用 MySQL Yum 仓库安装 MySQL
2.5.2 在 Linux 上使用 MySQL APT 仓库安装 MySQL
2.5.3 在 Linux 上使用 MySQL SLES 仓库安装 MySQL
2.5.4 使用 Oracle 的 RPM 软件包在 Linux 上安装 MySQL
2.5.5 在 Linux 上使用 Oracle Debian 软件包安装 MySQL
2.5.6 使用 Docker 容器在 Linux 上部署 MySQL
2.5.7 从本地软件仓库在 Linux 上安装 MySQL
2.5.8 使用 Juju 在 Linux 上安装 MySQL
2.5.9 使用 systemd 管理 MySQL 服务器
2.6 使用 Unbreakable Linux Network (ULN) 安装 MySQL
2.7 在 Solaris 上安装 MySQL
2.7.1 使用 Solaris PKG 在 Solaris 上安装 MySQL
2.8 从源代码安装 MySQL
2.8.1 源码安装方法
2.8.2 源码安装先决条件
2.8.3 源码安装 MySQL 布局
2.8.4 使用标准源码分发安装 MySQL
2.8.5 使用开发源树安装 MySQL
2.8.6 配置 SSL 库支持
2.8.7 MySQL 源码配置选项
2.8.8 处理编译 MySQL 时的问题
2.8.9 MySQL 配置和第三方工具
2.8.10 生成 MySQL Doxygen 文档内容
2.9 安装后设置和测试
2.9.1 初始化数据目录
2.9.2 启动服务器
2.9.3 测试服务器
2.9.4 保护初始 MySQL 帐户
2.9.5 自动启动和停止 MySQL
2.10 Perl 安装注意事项
2.10.1 在 Unix 上安装 Perl
2.10.2 在 Windows 上安装 ActiveState Perl
2.10.3 使用 Perl DBI/DBD 接口时的问题
本章描述了如何获取和安装 MySQL。以下是程序概要,后续章节提供了详细信息。如果您计划将现有版本的 MySQL 升级到新版本而不是首次安装 MySQL,请参阅第三章,升级 MySQL,了解升级过程和升级前应考虑的问题。
如果您有兴趣从另一个数据库系统迁移到 MySQL,请参阅附录 A.8,“MySQL 8.0 FAQ:迁移”,其中包含有关迁移问题的一些常见问题的答案。
通常,MySQL 的安装遵循以下步骤:
- 确定 MySQL 是否在您的平台上运行并受支持。
请注意,并非所有平台都适合运行 MySQL,并且并非所有已知可运行 MySQL 的平台都得到 Oracle 公司的官方支持。有关官方支持的平台信息,请参阅 MySQL 网站上的www.mysql.com/support/supportedplatforms/database.html
。 - 选择要安装的发行版。
MySQL 提供了多个版本,大多数版本都有几种分发格式可供选择。您可以选择包含二进制(预编译)程序或源代码的预打包分发。如果有疑问,请使用二进制分发。Oracle 还为那些想要查看最新开发并测试新代码的人提供了访问 MySQL 源代码的途径。要确定应使用哪个版本和分发类型,请参阅第 2.1.2 节,“应安装哪个 MySQL 版本和分发”。 - 选择要安装的跟踪。
MySQL 提供了一个修复错误跟踪(例如 MySQL 8.0),以及一个创新跟踪(今天是 MySQL 8.3),每个跟踪都针对不同的用例。这两个跟踪都被认为是可用于生产环境的,并包括错误修复,而创新发布还包括新功能和可能的修改行为。
修复错误跟踪升级包括点版本,例如 MySQL 8.0.x
升级到 8.0.y
,而创新跟踪发布通常只有次要版本,例如 MySQL 8.3.0 升级到 9.0.0。然而,创新跟踪确实偶尔有点版本发布。 - 下载要安装的分发。
有关说明,请参阅第 2.1.3 节,“如何获取 MySQL”。要验证分发的完整性,请使用第 2.1.4 节,“使用 MD5 校验和或 GnuPG 验证软件包完整性”中的说明。 - 安装分发。
要从二进制分发安装 MySQL,请使用第 2.2 节,“在 Unix/Linux 上使用通用二进制文件安装 MySQL”中的说明。或者,使用安全部署指南,该指南提供了部署 MySQL Enterprise Edition Server 通用二进制分发的程序,具有管理 MySQL 安装安全性功能的特性。
要从源代码分发或当前开发源代码树安装 MySQL,请使用第 2.8 节,“从源代码安装 MySQL”中的说明。 - 执行任何必要的安装后设置。
安装 MySQL 后,请参阅第 2.9 节,“安装后设置和测试”,了解确保 MySQL 服务器正常工作的信息。还请参考第 2.9.4 节,“保护初始 MySQL 帐户”中提供的信息。本节描述了如何保护初始的 MySQLroot
用户帐户,该帐户在分配密码之前没有密码。无论您是使用二进制还是源代码分发安装 MySQL,本节都适用。 - 如果要运行 MySQL 基准测试脚本,则必须提供 Perl 支持。请参阅第 2.10 节,“Perl 安装说明”。
提供了在不同平台和环境上安装 MySQL 的说明,具体请参考各个平台:
- Unix,Linux有关在大多数 Linux 和 Unix 平台上使用通用二进制文件(例如
.tar.gz
包)安装 MySQL 的说明,请参阅第 2.2 节,“在 Unix/Linux 上使用通用二进制文件安装 MySQL”。有关从源代码分发或源代码存储库构建 MySQL 的信息,请参阅第 2.8 节,“从源代码安装 MySQL”。有关在特定平台上安装、配置和从源代码构建的帮助,请参阅相应平台部分:
- Linux,包括特定发行版的安装方法,请参阅第 2.5 节,“在 Linux 上安装 MySQL”。
- IBM AIX,请参阅第 2.7 节,“在 Solaris 上安装 MySQL”。
- Microsoft Windows
有关在 Microsoft Windows 上安装 MySQL 的说明,可以使用 MySQL Installer 或 Zipped 二进制文件,请参阅第 2.3 节,“在 Microsoft Windows 上安装 MySQL”。
有关使用 Microsoft Visual Studio 从源代码构建 MySQL 的详细说明,请参阅第 2.8 节,“从源代码安装 MySQL”。 - macOS
有关在 macOS 上安装 MySQL,包括使用二进制包和本机 PKG 格式,请参阅第 2.4 节,“在 macOS 上安装 MySQL”。
有关如何利用 macOS Launch Daemon 自动启动和停止 MySQL 的信息,请参阅第 2.4.3 节,“安装和使用 MySQL Launch Daemon”。
有关 MySQL Preference Pane 的信息,请参阅第 2.4.4 节,“安装和使用 MySQL Preference Pane”。