# TiDB Course 201 潜在的非标准写作
+ 2022-05-13 14:08:23.550415

| 风险 | 建议 | 文件:实例 |
| :-- | :-- | :-- |
|  , | __potential-issue__ | chapter-04/13.md:tidb> SELECT concat('Welcome ', 'to ', NULL), concat_ws(' ','Welcome','to' ,NULL);,chapter-09-Python/15.md:为 TiDB 提供 `Python DB API` ,也称为`Python Database API Specification v2.0 (PEP 249)`,chapter-09-Python/25.md:解决方案 2:使用占位符或`Prepared Statement` ,例如在 Python 中:,chapter-10-Python/11.md:以上 `data_type` 是一种 java `JDBC`  类型 `java.sql.Types.CHAR` ,例如`java.sql.Types.INTEGER` ,等等,chapter-10-Python/13.md:对于`Statement` 或`PreparedStatement` ,将`Statement.RETURN_GENERATED_KEYS` 参数传递给`executeUpdate()`,chapter-10-Python/14.md:创建`cursor` ,传入参数`prepared=True`,chapter-12/08.md:- 删除表中全部的数据时,推荐使用 TRUNCATE 或者 重建（DROP then CREATE 的方式,或者使用分区表中的DROP/TRUNCATE PARTITION 的方式, 或者带有条件的DELETE where condition ..limit N的循环方式。DELETE,TRUNCATE 和 DROP 都不会立即释放空间。对于 TRUNCATE 和 DROP 操作,在达到 TiDB 的 GC (garbage collection) 时间后（默认 10 分钟. ,TiDB 的 GC 机制会删除数据并释放空间。对于 DELETE 操作 TiDB 的 GC 机制会删除数据,但不会释放空间,而是当后续数据写入 RocksDB 且进行 compact 时对空间重新利用。 |
| “ | " | chapter-01/04.md:- PD (Placement Driver) Server: 整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。,chapter-03/13.md:- 日期部分必须是“年-月-日”的格式（例如 1998-09-04）,而不是“月-日-年”或“日-月-年”的格式。,chapter-03/14.md:日期部分字面只值必须是“年-月-日”的格式（例如 1998-09-04）,而不是“月-日-年”或“日-月-年”的格式。,chapter-07/26.md:聚簇索引 (clustered index) 是 TiDB 从 v5.0 开始支持的特性,用于控制含有主键的表数据的存储方式。通过使用聚簇索引,TiDB 可以更好地组织数据表,从而提高某些查询的性能。有些数据库管理系统也将聚簇索引称为“索引组织表” (index-organized tables)。,chapter-10-Java/06.md:用户变量与表名和列名具有相同的命名条件。变量名由当前字符集中的字母数字字符以及字符 “.”、“_” 和 “$” 组成。要在变量名中使用其他字符,请将整个名称作为字符串或标识符放在引号内。例如,@'my-var'、@ “my-var” 或 @ `my-var` 。,chapter-10-Java/07.md:您可以准备一份完整的陈述或一份不完整的陈述。完整语句包含执行该语句所需的所有 SQL 代码和值。不完整语句包含准备时未知数据值的占位符。这些占位符用问号 “？” 表示字符。执行语句时,必须为语句中的每个参数提供一个特定的数据值。服务器会将标记替换为您提供的数据值以完成语句。每次执行语句时都可以使用不同的值。,chapter-11-Java/07.md:注意：本课程在标题为 “事务” 的课程中介绍事务处理。,chapter-11-Java/09.md:NO_ZERO_DATE，它不允许 MySQL 通常允许的诸如 “0000-00-00” 之类的日期，即使在严格模式下也是如此。,chapter-11-Java/09.md:`TRANDITIONAL`: 在这种模式下,TiDB 的行为更像 “传统” 的 SQL 数据库系统,chapter-11-Java/09.md:某些模式会更改 SQL 语法的处理方式，而 ANSI 模式包含了其中的几种模式。默认情况下，MySQL 内置函数不是保留字，因此即使有 COUNT () 函数，也可以创建名为 count 的列。“(” 字符必须紧跟在名称 “COUNT” 之后才能将其标识为函数。IGNORE_SPACE SQL 模式允许在函数名和 “(” 字符之间使用空格。这会导致内置函数名称被视为保留字。因此，必须用引号将标识符（如列名）与函数名相同的标识符括起来。默认情况下，标识符引号是反引号 ( `)，但 ANSI_QUOTES SQL 模式允许您使用双引号 (“) 来实现相同的目的。,chapter-11-Python/17show-#c-handling-exceptions-#s-23-#t-other-important-modes.md:`TRANDITIONAL`: 在这种模式下,TiDB 的行为更像 “传统” 的 SQL 数据库系统,chapter-12/11.md:但是！数据库的处理速度是很快,单次吞吐量是很大,执行效率极高。这时,“冲突”就发生,数据库处理速度很快,但是执行发往数据库要执行的语句却是一条一条发送,其速度可想而知。所以这种情况数据库的处理速度极快的特点就无法体现。所以,为了解决这种“冲突”,**addBatch()**出现了！addBatch()是把若干sql语句装载到一起,然后一次性传送到数据库执行,即是批量处理sql数据的。所以“冲突”得到解决,执行时间大大缩短。,chapter-12/13.md:但是！数据库的处理速度是很快,单次吞吐量是很大,执行效率极高。这时,“冲突”就发生,数据库处理速度很快,但是执行发往数据库要执行的语句却是一条一条发送,其速度可想而知。所以这种情况数据库的处理速度极快的特点就无法体现。所以,为了解决这种“冲突”,**addBatch()**出现了！addBatch() 是把若干 sql 语句装载到一起,然后一次性传送到数据库执行,即是批量处理sql数据的。所以“冲突”得到解决,执行时间大大缩短。 |
| ” | " | chapter-01/04.md:- PD (Placement Driver) Server: 整个 TiDB 集群的元信息管理模块,负责存储每个 TiKV 节点实时的数据分布情况和集群的整体拓扑结构,提供 TiDB Dashboard 管控界面,并为分布式事务分配事务 ID。PD 不仅存储元信息,同时还会根据 TiKV 节点实时上报的数据分布状态,下发数据调度命令给具体的 TiKV 节点,可以说是整个集群的“大脑”。此外,PD 本身也是由至少 3 个节点构成,拥有高可用的能力。建议部署奇数个 PD 节点。,chapter-03/13.md:- 日期部分必须是“年-月-日”的格式（例如 1998-09-04）,而不是“月-日-年”或“日-月-年”的格式。,chapter-03/14.md:日期部分字面只值必须是“年-月-日”的格式（例如 1998-09-04）,而不是“月-日-年”或“日-月-年”的格式。,chapter-07/26.md:聚簇索引 (clustered index) 是 TiDB 从 v5.0 开始支持的特性,用于控制含有主键的表数据的存储方式。通过使用聚簇索引,TiDB 可以更好地组织数据表,从而提高某些查询的性能。有些数据库管理系统也将聚簇索引称为“索引组织表” (index-organized tables)。,chapter-10-Java/06.md:用户变量与表名和列名具有相同的命名条件。变量名由当前字符集中的字母数字字符以及字符 “.”、“_” 和 “$” 组成。要在变量名中使用其他字符,请将整个名称作为字符串或标识符放在引号内。例如,@'my-var'、@ “my-var” 或 @ `my-var` 。,chapter-10-Java/07.md:您可以准备一份完整的陈述或一份不完整的陈述。完整语句包含执行该语句所需的所有 SQL 代码和值。不完整语句包含准备时未知数据值的占位符。这些占位符用问号 “？” 表示字符。执行语句时,必须为语句中的每个参数提供一个特定的数据值。服务器会将标记替换为您提供的数据值以完成语句。每次执行语句时都可以使用不同的值。,chapter-11-Java/07.md:注意：本课程在标题为 “事务” 的课程中介绍事务处理。,chapter-11-Java/09.md:NO_ZERO_DATE，它不允许 MySQL 通常允许的诸如 “0000-00-00” 之类的日期，即使在严格模式下也是如此。,chapter-11-Java/09.md:`TRANDITIONAL`: 在这种模式下,TiDB 的行为更像 “传统” 的 SQL 数据库系统,chapter-11-Java/09.md:某些模式会更改 SQL 语法的处理方式，而 ANSI 模式包含了其中的几种模式。默认情况下，MySQL 内置函数不是保留字，因此即使有 COUNT () 函数，也可以创建名为 count 的列。“(” 字符必须紧跟在名称 “COUNT” 之后才能将其标识为函数。IGNORE_SPACE SQL 模式允许在函数名和 “(” 字符之间使用空格。这会导致内置函数名称被视为保留字。因此，必须用引号将标识符（如列名）与函数名相同的标识符括起来。默认情况下，标识符引号是反引号 ( `)，但 ANSI_QUOTES SQL 模式允许您使用双引号 (“) 来实现相同的目的。,chapter-11-Python/17show-#c-handling-exceptions-#s-23-#t-other-important-modes.md:`TRANDITIONAL`: 在这种模式下,TiDB 的行为更像 “传统” 的 SQL 数据库系统,chapter-12/11.md:但是！数据库的处理速度是很快,单次吞吐量是很大,执行效率极高。这时,“冲突”就发生,数据库处理速度很快,但是执行发往数据库要执行的语句却是一条一条发送,其速度可想而知。所以这种情况数据库的处理速度极快的特点就无法体现。所以,为了解决这种“冲突”,**addBatch()**出现了！addBatch()是把若干sql语句装载到一起,然后一次性传送到数据库执行,即是批量处理sql数据的。所以“冲突”得到解决,执行时间大大缩短。,chapter-12/13.md:但是！数据库的处理速度是很快,单次吞吐量是很大,执行效率极高。这时,“冲突”就发生,数据库处理速度很快,但是执行发往数据库要执行的语句却是一条一条发送,其速度可想而知。所以这种情况数据库的处理速度极快的特点就无法体现。所以,为了解决这种“冲突”,**addBatch()**出现了！addBatch() 是把若干 sql 语句装载到一起,然后一次性传送到数据库执行,即是批量处理sql数据的。所以“冲突”得到解决,执行时间大大缩短。 |
| ， | , | chapter-11-Java/06.md:设置全局变量将为所有后续客户端连接指定默认 SQL 模式。设置会话变量仅影响当前客户端，直到它断开连接。任何客户端都可以随时更改自己的会话 sql_mode 值。如果既未指定全局也未指定 SESSION，则缺省值为 SESSION。,chapter-11-Java/07.md:STRICT_ALL_TABLES 与 STRICT_TRANS_TABLES 类似，但对于非事务性表，即使在多行插入的第二行或更高行中出现错误，它也会导致语句中止。这可能会导致部分更新。为了避免在使用 STRICT_ALL_TABLES 时出现这种情况，必须使用可以在不更改表的情况下中止的单行语句。,chapter-11-Java/07.md:TiDB 在提供无效数据时通常比许多传统数据库系统更宽容。例如，如果您在 UNSIGNED 列中写入负值，TiDB 会将其转换为零，这是该列数据类型最接近的合法值。在严格模式下，服务器拒绝超出范围、数据类型不正确或没有默认值的列缺失的值。,chapter-11-Java/07.md:如果在使用事务表（例如使用默认存储引擎 InnoDB 创建的表）时生成错误并启用 STRICT_TRANS_TABLES，则语句将中止。,chapter-11-Java/07.md:对于非事务表，如果错误发生在插入操作的第一行（或唯一一行），TiDB 会中止该语句。如果在第二次或以后的插入中出现错误，TiDB 会将任何无效值调整为合法值，然后将其插入，并仅生成警告。这是因为之前的插入是成功的。,chapter-11-Java/09.md:ANSI 和传统 SQL 模式是 MySQL 中的组合模式，可启用多种模式。,chapter-11-Java/09.md:ERROR_FOR_DIVISION_BY_ZERO，它会引发错误并中止任何试图将值除以零的语句。如果未启用此模式，MySQL 会将除数为零的计算结果为 NULL 并发出警告。,chapter-11-Java/09.md:NO_ZERO_DATE，它不允许 MySQL 通常允许的诸如 “0000-00-00” 之类的日期，即使在严格模式下也是如此。,chapter-11-Java/09.md:某些模式会更改 SQL 语法的处理方式，而 ANSI 模式包含了其中的几种模式。默认情况下，MySQL 内置函数不是保留字，因此即使有 COUNT () 函数，也可以创建名为 count 的列。“(” 字符必须紧跟在名称 “COUNT” 之后才能将其标识为函数。IGNORE_SPACE SQL 模式允许在函数名和 “(” 字符之间使用空格。这会导致内置函数名称被视为保留字。因此，必须用引号将标识符（如列名）与函数名相同的标识符括起来。默认情况下，标识符引号是反引号 ( `)，但 ANSI_QUOTES SQL 模式允许您使用双引号 (“) 来实现相同的目的。,chapter-11-Java/09.md:注意：有关服务器 SQL 模式的完整列表，请参阅：https://dev.mysql.com/doc/mysql/en/sql-mode.html。,chapter-11-Java/11.md:如果连接或语句失败，TiDB 会产生错误消息,chapter-11-Java/11.md:并非所有 TiDB 错误号都有相应的 SQLSTATE 代码。在这种情况下，TiDB 使用 HY000，即一般错误 |
| ： | : | chapter-11-Java/07.md:注意：本课程在标题为 “事务” 的课程中介绍事务处理。,chapter-11-Java/09.md:大多数 SQL 模式会更改单个行为。这些包括： |
