fsk119 commented on code in PR #19498: URL: https://github.com/apache/flink/pull/19498#discussion_r866558853
##########
docs/content.zh/docs/dev/table/types.md:
##########
@@ -1487,6 +1481,93 @@ Not supported.
{{< /tab >}}
{{< /tabs >}}
+<a name="casting"></a>
+
+cast 方法
+-------
+
+Flink Table API 和 Flink SQL 支持从 `输入` 数据类型 到 `目标` 数据类型的转换。有的转换
+无论输入值是什么都能保证转换成功,而有些转换则会发生错误,在运行时失败(即不可能转换为 `目标` 数据类型对应的值)。
+例如,将 `INT` 数据类型的值转换为 `STRING` 数据类型一定能转换成功,但反过来从 `STRING` 数据类型
+转换为 `INT` 数据类型就不一定了。
+
+在生成执行计划时,Flink 的 SQL 检查器会拒绝提交那些不可能直接转换为 `目标` 数据类型的SQL,并抛出
`ValidationException` 异常,
+例如想要从 `TIMESTAMP` 数据类型转化到 `INTERVAL` 数据类型。
+然而有些查询即使通过了 SQL 检查器的验证,依旧可能会在运行期间转换失败,这就需要用户手动处理这些失败了。
+
+在 Flink Table API 和 Flink SQL 中,可以用下面两个内置方法来进行转换操作:
+
+* `CAST`:符合标准 SQL 的常规 cast 方法。在某些容易发生转换失败的查询场景中,当实际输入数据不是其 `输入`
数据类型时,作业便会运行失败。另外,类型校验机制支持输入的数据中有空值。
+* `TRY_CAST`:常规 cast 方法的扩展,当转换失败时返回 `NULL`。该方法的返回值允许为空。
+
+例如:
+
+```sql
+CAST('42' AS INT) --- 结果返回数字 42 的 INT 格式(非空)
+CAST(NULL AS VARCHAR) --- 结果返回 VARCHAR 类型的空值
+CAST('non-number' AS INT) --- 抛出异常,并停止作业
+
+TRY_CAST('42' AS INT) --- 结果返回数字 42 的 INT 格式
+TRY_CAST(NULL AS VARCHAR) --- 结果返回 VARCHAR 类型的空值
+TRY_CAST('non-number' AS INT) --- 结果返回 INT 类型的空值
+COALESCE(TRY_CAST('non-number' AS INT), 0) --- 结果返回数字 0 的 INT 格式(非空)
+```
+
+下表展示了各个类型的转换程度,"Y" 表示支持,"!" 表示转换可能会失败,"N" 表示不支持:
+
+| 输入类型\输出类型 |
`CHAR`¹/<br/>`VARCHAR`¹/<br/>`STRING` |
`BINARY`¹/<br/>`VARBINARY`¹/<br/>`BYTES` | `BOOLEAN` | `DECIMAL` | `TINYINT` |
`SMALLINT` | `INTEGER` | `BIGINT` | `FLOAT` | `DOUBLE` | `DATE` | `TIME` |
`TIMESTAMP` | `TIMESTAMP_LTZ` | `INTERVAL` | `ARRAY` | `MULTISET` | `MAP` |
`ROW` | `STRUCTURED` | `RAW` |
+|:---------------------------------------|:-------------------------------------:|:----------------------------------------:|:---------:|:---------:|:---------:|:----------:|:---------:|:--------:|:-------:|:--------:|:------:|:------:|:-----------:|:---------------:|:----------:|:-------:|:----------:|:-----:|:-----:|:------------:|:-----:|
+| `CHAR`/<br/>`VARCHAR`/<br/>`STRING` | Y
| ! | ! | ! | !
| ! | ! | ! | ! | ! | ! | ! |
! | ! | N | N | N | N | N
| N | N |
+| `BINARY`/<br/>`VARBINARY`/<br/>`BYTES` | Y
| Y | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | N |
+| `BOOLEAN` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N |
+| `DECIMAL` | Y
| N | N | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N |
+| `TINYINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N |
+| `SMALLINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | N | N | N | N | N
| N | N |
+| `INTEGER` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁵ | N | N | N | N
| N | N |
+| `BIGINT` | Y
| N | Y | Y | Y
| Y | Y | Y | Y | Y | N | N |
N² | N² | Y⁶ | N | N | N | N
| N | N |
+| `FLOAT` | Y
| N | N | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N |
+| `DOUBLE` | Y
| N | N | Y | Y
| Y | Y | Y | Y | Y | N | N |
N | N | N | N | N | N | N
| N | N |
+| `DATE` | Y
| N | N | N | N
| N | N | N | N | N | Y | N |
Y | Y | N | N | N | N | N
| N | N |
+| `TIME` | Y
| N | N | N | N
| N | N | N | N | N | N | Y |
Y | Y | N | N | N | N | N
| N | N |
+| `TIMESTAMP` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N |
+| `TIMESTAMP_LTZ` | Y
| N | N | N | N
| N | N | N | N | N | Y | Y |
Y | Y | N | N | N | N | N
| N | N |
+| `INTERVAL` | Y
| N | N | N | N
| N | Y⁵ | Y⁶ | N | N | N | N |
N | N | Y | N | N | N | N
| N | N |
+| `ARRAY` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | !³ | N | N | N
| N | N |
+| `MULTISET` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | !³ | N | N
| N | N |
+| `MAP` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | !³ | N
| N | N |
+| `ROW` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | !³
| N | N |
+| `STRUCTURED` | Y
| N | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| !³ | N |
+| `RAW` | Y
| ! | N | N | N
| N | N | N | N | N | N | N |
N | N | N | N | N | N | N
| N | Y⁴ |
+
+备注:
+
+1. 在转换时,输入数据中的常量、变量会根据目标数据类型的格式进行修剪(trim)或填充(pad)。
Review Comment:
所有转化到具有固长或变长的类型时会根据类型的定义来裁剪或填充数据。
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
