添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Skip to main content

类型转换函数

数值类型转换常见的问题

当你把一个值从一个类型转换为另外一个类型的时候,你需要注意的是这是一个不安全的操作,可能导致数据的丢失。数据丢失一般发生在你将一个大的数据类型转换为小的数据类型的时候,或者你把两个不同的数据类型相互转换的时候。

ClickHouse和 C++ 有相同的类型转换行为。

toInt(8 | 16 | 32 | 64)

转换一个输入值为 Int 类型。这个函数包括:

  • toInt8(expr) — 结果为 Int8 数据类型。
  • toInt16(expr) — 结果为 Int16 数据类型。
  • toInt32(expr) — 结果为 Int32 数据类型。
  • toInt64(expr) — 结果为 Int64 数据类型。

参数

  • expr 表达式 返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。

返回值

整形在 Int8 , Int16 , Int32 ,或者 Int64 的数据类型。

函数使用 rounding towards zero 原则,这意味着会截断丢弃小数部分的数值。

NaN and Inf 转换是不确定的。具体使用的时候,请参考 数值类型转换常见的问题

例子

SELECT toInt64(nan), toInt32(32), toInt16('16'), toInt8(8.8)
┌─────────toInt64(nan)─┬─toInt32(32)─┬─toInt16('16')─┬─toInt8(8.8)─┐
│ -9223372036854775808 │ 32 │ 16 │ 8 │
└──────────────────────┴─────────────┴───────────────┴─────────────┘

toInt(8 | 16 | 32 | 64)OrZero

这个函数需要一个字符类型的入参,然后尝试把它转为 Int (8 | 16 | 32 | 64) ,如果转换失败直接返回0。

例子

select toInt64OrZero('123123'), toInt8OrZero('123qwe123')
┌─toInt64OrZero('123123')─┬─toInt8OrZero('123qwe123')─┐
│ 123123 │ 0 │
└─────────────────────────┴───────────────────────────┘

toInt(8 | 16 | 32 | 64)OrNull

这个函数需要一个字符类型的入参,然后尝试把它转为 Int (8 | 16 | 32 | 64) ,如果转换失败直接返回 NULL

例子

select toInt64OrNull('123123'), toInt8OrNull('123qwe123')
┌─toInt64OrNull('123123')─┬─toInt8OrNull('123qwe123')─┐
│ 123123 │ ᴺᵁᴸᴸ │
└─────────────────────────┴───────────────────────────┘

toUInt(8 | 16 | 32 | 64)

转换一个输入值到 UInt 类型。 这个函数包括:

  • toUInt8(expr) — 结果为 UInt8 数据类型。
  • toUInt16(expr) — 结果为 UInt16 数据类型。
  • toUInt32(expr) — 结果为 UInt32 数据类型。
  • toUInt64(expr) — 结果为 UInt64 数据类型。

参数

  • expr 表达式 返回一个数字或者代表数值类型的字符串。不支持二进制、八进制、十六进制的数字形式,有效数字之前的0也会被忽略。

返回值

整形在 UInt8 , UInt16 , UInt32 ,或者 UInt64 的数据类型。

函数使用 rounding towards zero 原则,这意味着会截断丢弃小数部分的数值。

对于负数和 NaN and Inf 来说转换的结果是不确定的。如果你传入一个负数,比如: '-32' ,ClickHouse会抛出异常。具体使用的时候,请参考 数值类型转换常见的问题

例子

SELECT toUInt64(nan), toUInt32(-32), toUInt16('16'), toUInt8(8.8)
┌───────toUInt64(nan)─┬─toUInt32(-32)─┬─toUInt16('16')─┬─toUInt8(8.8)─┐
│ 9223372036854775808 │ 4294967264 │ 16 │ 8 │
└─────────────────────┴───────────────┴────────────────┴──────────────┘

toUInt(8 | 16 | 32 | 64)OrZero

toUInt(8 | 16 | 32 | 64)OrNull

toFloat(32 | 64)

toFloat(32 | 64)OrZero

toFloat(32 | 64)OrNull

toDate

toDateOrZero

toDateOrNull

toDateTime

toDateTimeOrZero

toDateTimeOrNull

toDecimal(32 | 64 | 128)

转换 value Decimal 类型的值,其中精度为 S value 可以是一个数字或者一个字符串。 S 指定小数位的精度。

  • toDecimal32(value, S)
  • toDecimal64(value, S)
  • toDecimal128(value, S)

toDecimal(32 | 64 | 128)OrNull

转换一个输入的字符到 Nullable(Decimal(P,S)) 类型的数据。这个函数包括:

  • toDecimal32OrNull(expr, S) — 结果为 Nullable(Decimal32(S)) 数据类型。
  • toDecimal64OrNull(expr, S) — 结果为 Nullable(Decimal64(S)) 数据类型。
  • toDecimal128OrNull(expr, S) — 结果为 Nullable(Decimal128(S)) 数据类型。

如果在解析输入值发生错误的时候你希望得到一个 NULL 值而不是抛出异常,你可以使用该函数。

参数

  • expr 表达式 返回一个 String 类型的数据。 ClickHouse倾向于文本类型的表示带小数类型的数值,比如 '1.111'
  • S — 小数位的精度。

返回值

Nullable(Decimal(P,S)) 类型的数据,包括:

  • 如果有的话,小数位 S
  • 如果解析错误或者输入的数字的小数位多于 S ,那结果为 NULL

例子

SELECT toDecimal32OrNull(toString(-1.111), 5) AS val, toTypeName(val)
┌────val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 5))─┐
│ -1.111 │ Nullable(Decimal(9, 5)) │
└────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrNull(toString(-1.111), 2) AS val, toTypeName(val)
┌──val─┬─toTypeName(toDecimal32OrNull(toString(-1.111), 2))─┐
│ ᴺᵁᴸᴸ │ Nullable(Decimal(9, 2)) │
└──────┴────────────────────────────────────────────────────┘

toDecimal(32 | 64 | 128)OrZero

转换输入值为 Decimal(P,S) 类型数据。这个函数包括:

  • toDecimal32OrZero( expr, S) — 结果为 Decimal32(S) 数据类型。
  • toDecimal64OrZero( expr, S) — 结果为 Decimal64(S) 数据类型。
  • toDecimal128OrZero( expr, S) — 结果为 Decimal128(S) 数据类型。

当解析错误的时候,你不需要抛出异常而希望得到 0 值,你可以使用该函数。

参数

  • expr 表达式 返回一个 String 类型的数据。 ClickHouse倾向于文本类型的表示带小数类型的数值,比如 '1.111'
  • S — 小数位的精度。

返回值

A value in the Nullable(Decimal(P,S)) data type. The value contains:

  • 如果有的话,小数位 S
  • 如果解析错误或者输入的数字的小数位多于 S ,那结果为小数位精度为 S 0 例子
SELECT toDecimal32OrZero(toString(-1.111), 5) AS val, toTypeName(val)
┌────val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 5))─┐
│ -1.111 │ Decimal(9, 5) │
└────────┴────────────────────────────────────────────────────┘
SELECT toDecimal32OrZero(toString(-1.111), 2) AS val, toTypeName(val)
┌──val─┬─toTypeName(toDecimal32OrZero(toString(-1.111), 2))─┐
│ 0.00 │ Decimal(9, 2) │
└──────┴────────────────────────────────────────────────────┘

toString

这些函数用于在数字、字符串(不包含FixedString)、Date以及DateTime之间互相转换。 所有的函数都接受一个参数。

当将其他类型转换到字符串或从字符串转换到其他类型时,使用与TabSeparated格式相同的规则对字符串的值进行格式化或解析。如果无法解析字符串则抛出异常并取消查询。

当将Date转换为数字或反之,Date对应Unix时间戳的天数。