类型转换函数
数值类型转换常见的问题
当你把一个值从一个类型转换为另外一个类型的时候,你需要注意的是这是一个不安全的操作,可能导致数据的丢失。数据丢失一般发生在你将一个大的数据类型转换为小的数据类型的时候,或者你把两个不同的数据类型相互转换的时候。
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 │
└─────────────────────┴───────────────┴────────────────┴──────────────┘