<div id="article_content" class="article_content clearfix">
<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/kdoc_html_views-1a98987dfd.css">
<link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-25cebea3f9.css">
<div id="content_views" class="htmledit_views">
<h1><a name="t0"></a>1. 數據類型</h1>
<p style="text-indent:33px;">基礎類型只有數值、字符串和時間三種類型,沒有<a href="https://so.csdn.net/so/search?q=Boolean&spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{"spm":"1001.2101.3001.7020","dest":"https://so.csdn.net/so/search?q=Boolean&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"Boolean\"}"}" data-tit="Boolean" data-pretit="boolean">Boolean</a>類型,但可以使用整型的0或1替代。</p>
<p style="text-indent:33px;"><a href="https://so.csdn.net/so/search?q=ClickHouse&spm=1001.2101.3001.7020" target="_blank" class="hl hl-1" data-report-click="{"spm":"1001.2101.3001.7020","dest":"https://so.csdn.net/so/search?q=ClickHouse&spm=1001.2101.3001.7020","extra":"{\"searchword\":\"ClickHouse\"}"}" data-tit="ClickHouse" data-pretit="clickhouse">ClickHouse</a>的數據類型和常見的其他存儲系統的數據類型對比:</p>
<div class="table-box"><table align="center" border="1" cellpadding="1" cellspacing="1" style="width:500px;"><thead><tr><th>MySQL</th><th>Hive</th><th>CLickHouse(區分大小寫)</th></tr></thead><tbody><tr><td>byte</td><td>TINYINT</td><td>Int8</td></tr><tr><td>short</td><td>SMALLINT</td><td>Int16</td></tr><tr><td>int</td><td>INT</td><td>Int32</td></tr><tr><td>long</td><td>BIGINT</td><td>Int64</td></tr><tr><td>varchar</td><td>STRING</td><td>String</td></tr><tr><td>timestamp</td><td>TIMESTAMP</td><td>DateTime</td></tr><tr><td>float</td><td>FLOAT</td><td>Float32</td></tr><tr><td>double</td><td>DOUBLE</td><td>Float64</td></tr><tr><td>boolean</td><td>BOOLEAN</td><td>無</td></tr></tbody></table></div>
<p style="text-indent:33px;">更多可查看官網:https://clickhouse.tech/docs/zh/sql-reference/data-types/</p>
<h2><a name="t1"></a>1.1.數值類型</h2>
<h3><a name="t2"></a>1.1.1.整數</h3>
<p style="text-indent:33px;">整型范圍:( <img alt="-2^{n-1}" class="mathcode" src="https://latex.codecogs.com/gif.latex?-2%5E%7Bn-1%7D">到 <img alt="2^{n-1}-1" class="mathcode" src="https://latex.codecogs.com/gif.latex?2%5E%7Bn-1%7D-1">):</p>
<blockquote>
<p>Int8 - [-128 : 127]<br> Int16 - [-32768 : 32767]<br> Int32 - [-2147483648 : 2147483647]<br> Int64 - [-9223372036854775808 : 9223372036854775807]</p>
</blockquote>
<p style="text-indent:33px;">無符號整型范圍( 0到<img alt="2^{n}-1" class="mathcode" src="https://latex.codecogs.com/gif.latex?2%5E%7Bn%7D-1"> ):</p>
<blockquote>
<p style="text-indent:0;">UInt8 - [0 : 255]<br> UInt16 - [0 : 65535]<br> UInt32 - [0 : 4294967295]<br> UInt64 - [0 : 18446744073709551615]</p>
</blockquote>
<h3><a name="t3"></a>1.1.2.浮點型</h3>
<p style="text-indent:33px;">與整數類似,ClickHouse 直接使用 Float32 和 Float64 代表單精度浮點數以及雙精度浮點數</p>
<p style="text-indent:33px;">建議盡可能以整數形式存儲數據。例如,將固定精度的數字轉換為整數值,如時間用毫秒為單位表示,因為浮點型進行計算時可能引起四舍五入的誤差。</p>
<blockquote>
<p>hadoop1 :) select 1 - 0.9;</p>
<p>SELECT 1 - 0.9</p>
<p>┌───────minus(1, 0.9)─┐<br> │ 0.09999999999999998 │<br> └─────────────────────┘</p>
<p>1 rows in set. Elapsed: 0.010 sec. </p>
</blockquote>
<p style="text-indent:33px;">比較特殊的情況:</p>
<p style="text-indent:33px;">1.inf 表示正無窮;-inf表示負無窮;nan表示非數字。</p>
<blockquote>
<p>hadoop1 :) select -1/0;</p>
<p>SELECT -1 / 0</p>
<p>┌─divide(-1, 0)─┐<br> │ -inf │<br> └───────────────┘</p>
</blockquote>
<blockquote>
<p>hadoop1 :) select 0/0;</p>
<p>SELECT 0 / 0</p>
<p>┌─divide(0, 0)─┐<br> │ nan │<br> └──────────────┘</p>
</blockquote>
<p style="text-indent:33px;">2. Float32 從小數點后第 8 位起及 Float64 從小數點后第 17 位起,都產生了數據溢出,會進行舍棄。</p>
<blockquote>
<p>hadoop1 :) select toFloat64('0.1234567901234567890123456789') as a,<br> :-] toTypeName(a);</p>
<p>SELECT <br> toFloat64('0.1234567901234567890123456789') AS a,<br> toTypeName(a)</p>
<p>┌───────────────────a─┬─toTypeName(toFloat64('0.1234567901234567890123456789'))─┐<br> │ 0.12345679012345678 │ Float64 │<br> └─────────────────────┴─────────────────────────────────────────────────────────┘</p>
</blockquote>
<h3><a name="t4"></a>1.1.3.Decimal</h3>
<p style="text-indent:33px;">如果要求更高精度的數值運算,則需要使用定點數。ClickHouse 提供了Decimal32、Decimal64 和Decimal128 三種精度的定點數。可以通過兩種形式聲明定點:簡寫方式有Decimal32(S)、Decimal64(S)、Decimal128(S)三種,原生方式為Decimal(P, S),其中:</p>
<blockquote>
<p style="text-indent:0;">P代表精度,決定總位數(整數部分+小數部分),取值范圍是1~38;<br> S代表規模,決定小數位數,取值范圍是0~P。</p>
</blockquote>
<p style="text-indent:33px;"> 簡寫方式與原生方式的對應關系:</p>
<div class="table-box"><table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><thead><tr><th>名稱</th><th>等效聲明</th><th>范圍</th></tr></thead><tbody><tr><td>Decimal32(S)</td><td>Decimal(1~9, S)</td><td>-1 * 10^(9-S) 到 1 * 10^(9-S)</td></tr><tr><td>Decimal64(S)</td><td>Decimal(10~18, S)</td><td>-1 * 10^(18-S) 到 1 * 10^(18-S)</td></tr><tr><td>Decimal128(S)</td><td>Decimal(19~38, S)</td><td>-1 * 10^(38-S) 到 1 * 10^(38-S)</td></tr></tbody></table></div>
<p style="text-indent:33px;">在使用兩個不同精度的定點數進行四則運算的時候,它們的小數點位數S會發生變化。總結如下:</p>
<div class="table-box"><table border="1" cellpadding="1" cellspacing="1" style="width:500px;"><thead><tr><th>名稱</th><th>規則</th></tr></thead><tbody><tr><td>加法</td><td>S = max(S1, S2)</td></tr><tr><td>減法</td><td>S = max(S1, S2)</td></tr><tr><td>乘法</td><td>S = S1 + S2(S1范圍 >= S2范圍)</td></tr><tr><td>除法</td><td>S = S1(S1為被除數,S1/S2)</td></tr></tbody></table></div>
<h3><a name="t5"></a>1.1.4.布爾類型</h3>
<p style="text-indent:33px;">沒有單獨的類型來存儲布爾值。可以使用 UInt8 類型,取值限制為 0 或 1。而且在 ClickHouse 使用過程中,你也會發現,做比較得到的結果都是 1 或者 0,而不是通常意義上的 True 或者 False。</p>
<blockquote>
<p>hadoop1 :) select 1 == 1;</p>
<p>SELECT 1 = 1</p>
<p>┌─equals(1, 1)─┐<br> │ 1 │<br> └──────────────┘</p>
<p>1 rows in set. Elapsed: 0.005 sec. </p>
<p>hadoop1 :) select 1==2;</p>
<p>SELECT 1 = 2</p>
<p>┌─equals(1, 2)─┐<br> │ 0 │<br> └──────────────┘</p>
</blockquote>
<h2><a name="t6"></a>1.2.字符串</h2>
<p style="text-indent:33px;">字符串類型可以細分為 String、FixedString 和 UUID 三類。</p>
<h3><a name="t7"></a>1.2.1. String類型</h3>
<p style="text-indent:33px;">字符串可以任意長度的。它可以包含任意的字節集,包含空字節,可以用來替換 VARCHAR,BLOB,CLOB 等數據類型。字符串由String定義,長度不限。因此在使用String的時候無須聲明大小。它完全代替了傳統意義上數據庫的Varchar、Text、Clob和Blob等字符類型。String類型不限定字符集,因為它根本就沒有這個概念,所以可以將任意編碼的字符串存入其中。但是為了程序的規范性和可維護性,在同一套程序中應該遵循使用統一的編碼,例如“統一保持UTF-8編碼”就是一種很好的約定。</p>
<h3><a name="t8"></a>1.2.2.FixedString類型</h3>
<p style="text-indent:33px;">FixedString 類型和傳統意義上的 Char 類型有些類似,對于一些字符有明確長度的場合,可以使用固定長度的字符串。定長字符串通過 FixedString(N) 聲明,其中 N 表示字符串長度。但與 Char 不同的是,FixedString 使用 null字節填充末尾字符,而 Char 通常使用空格填充。比如在下面的例子中,字符串‘abc’ 雖然只有 3 位,但長度卻是5,因為末尾有2位空字符填充:</p>
<pre data-index="0"><code class="language-sql hljs"><span class="hljs-keyword">SELECT</span> toFixedString(<span class="hljs-string">'abc'</span>, <span class="hljs-number">5</span>), LENGTH(toFixedString (<span class="hljs-string">'abc'</span>,<span class="hljs-number">5</span>))<span class="hljs-keyword">AS</span> LENGTH;</code><div class="hljs-button {2}" data-title="復制" onclick="hljs.copyCode(event)"></div></pre>
<p style="text-indent:33px;">固定長度 N 的字符串,N 必須是嚴格的正自然數。當服務端讀取長度小于 N 的字符串時候,通過在字符串末尾添加空字節來達到 N 字節長度。 當服務端讀取長度大于 N 的字符串時候,將返回錯誤消息。與 String 相比,極少會使用 FixedString,因為使用起來不是很方便。</p>
<p style="text-indent:33px;">總結:</p>
<ul><li><span style="color:#f33b45;">N是最大字節數(Byte),不是字符長度,如果是UTF8字符串,那么就會占用3字節,GBK會占用2字節.</span></li><li>當內容少于N,數據庫會自動在右填充空字節(null byte)(跟PGsql不一樣,PGsql填充的是空格),當內容大于N時候,會拋出錯誤.</li><li>當寫入內容后面后空字節,系統不會自動去裁剪,查詢的時候也會被輸出(mysql不會輸出)</li><li>FixedString(N) 比 String 支持更少的方法</li></ul>
<h3><a name="t9"></a>1.2.3.UUID</h3>
<p style="text-indent:33px;">UUID 是一種數據庫常見的主鍵類型,在 ClickHouse 中直接把它作為一種數據類型。UUID 共有 32位,它的格式為8-4-4-4-12。如果一個 UUID 類型的字段在寫入數據時沒有被賦值,則會依照格式使用0(00000000-0000-0000-0000-000000000000)填充。</p>
<h2><a name="t10"></a>1.3. 日期時間類型</h2>
<p style="text-indent:33px;">時間類型分為 DateTime、DateTime64 和 Date 三類。ClickHouse 目前沒有時間戳類型。時間類型最高的精度是秒,也就是說,如果需要處理毫秒、微秒等大于秒分辨率的時間,則只能借助 UInt 類型實現。</p>
<h3><a name="t11"></a>1.3.1.Date類型</h3>
<p style="text-indent:33px;">日期類型,用兩個字節存儲,表示從 1970-01-01 (無符號) 到當前的日期值。允許存儲從 Unix 紀元開始到編譯階段定義的上限閾值常量(目前上限是2106年,但最終完全支持的年份為2105)。最小值輸出為1970-01-01。</p>
<p style="text-indent:33px;">Date類型不包含具體的時間信息,只精確到天,它支持字符串形式寫入。即使寫入的為yyyy-MM-dd HH:mm:ss,也會將其截取為yyyy-MM-dd。</p>
<h3><a name="t12"></a>1.3.2. DateTime類型</h3>
<p style="text-indent:33px;">時間戳類型。用四個字節(無符號的整數類型,Uint32)存儲 Unix 時間戳。允許存儲與 Date 類型相同的范圍內的值。最小值為 1970-01-01 00:00:00。時間戳類型值精確到秒(沒有閏秒)。</p>
<h3><a name="t13"></a>1.3.3.DateTime64類型</h3>
<p style="text-indent:33px;">DateTime64 可以記錄亞秒,它在 DateTime 之上增加了精度的設置,例如:</p>
<h2><a name="t14"></a>1.4.復合類型</h2>
<h3><a name="t15"></a>1.4.1. 枚舉類型</h3>
<p style="text-indent:33px;">ClickHouse 支持枚舉類型,這是一種在定義常量時經常會使用的數據類型。ClickHouse 提供了Enum8 和Enum16 兩種枚舉類型,它們除了取值范圍不同之外,別無二致。枚舉固定使用(String:Int)Key/Value鍵值對的形式定義數據,所以Enum8和Enum16分別會對應(String:Int8) 和 (String:Int16)包括 Enum8 和 Enum16 類型。Enum 保存 'string'= integer 的對應關系。建表的時候 Key/Value 是不允許重復的。其次, Key/Value 不能同時為 Null ,但是Key允許空字符串。</p>
<p style="text-indent:33px;">在定義枚舉集合的時候,有幾點需要注意。首先,Key和Value是不允許重復的,要保證唯一性。其次,Key和Value的值都不能為Null,但Key允許是空字符串。在寫入枚舉數據的時候,只會用到Key字符串部分。</p>
<p style="text-indent:33px;">使用枚舉的優勢:<span style="color:#f33b45;">出于性能的考慮。因為雖然枚舉定義中的Key屬于String類型,但是在后續對枚舉的所有操作中(包括排序、分組、去重、過濾等),會使用Int類型的Value值。</span></p>
<p style="text-indent:33px;">案例:</p>
<pre data-index="1"><code class="language-sql hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> my_enum_test (x Enum8(<span class="hljs-string">'a'</span> <span class="hljs-operator">=</span> <span class="hljs-number">1</span>, <span class="hljs-string">'b'</span> <span class="hljs-operator">=</span> <span class="hljs-number">2</span>, <span class="hljs-string">'c'</span><span class="hljs-operator">=</span><span class="hljs-number">3</span>)) ENGINE <span class="hljs-operator">=</span> TinyLog;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> my_enum_test <span class="hljs-keyword">VALUES</span> (<span class="hljs-string">'a'</span>), (<span class="hljs-string">'b'</span>), (<span class="hljs-string">'c'</span>);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">SELECT</span> <span class="hljs-built_in">CAST</span>(x, <span class="hljs-string">'Int8'</span>) <span class="hljs-keyword">FROM</span> my_enum_test ;</div></div></li></ol></code><div class="hljs-button {2}" data-title="復制" onclick="hljs.copyCode(event)"></div></pre>
<h3><a name="t16"></a>1.4.2.數組</h3>
<p style="text-indent:33px;">array[T]:T 可以是任意類型,包含數組類型。 但不推薦使用多維數組,ClickHouse 對多維數組的支持有限。例如,不能存儲在 MergeTree 表中存儲多維數組。</p>
<pre data-index="2"><code class="language-sql hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">SELECT</span> <span class="hljs-keyword">array</span>(<span class="hljs-number">1</span>, <span class="hljs-number">2</span>) <span class="hljs-keyword">AS</span> x, toTypeName(x);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">SELECT</span> [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>] <span class="hljs-keyword">AS</span> x, toTypeName(x);</div></div></li></ol></code><div class="hljs-button {2}" data-title="復制" onclick="hljs.copyCode(event)"></div></pre>
<p style="text-indent:33px;">ClickHouse 會自動檢測數組元素,并根據元素計算出存儲這些元素最小的數據類型。<span style="color:#f33b45;">如果在元素中存在 Null 或存在 Nullable 類型元素,那么數組的元素類型將會變成 Nullable </span>。</p>
<p style="text-indent:33px;">如果 ClickHouse 無法確定數據類型,它將產生異常。當嘗試同時創建一個包含字符串和數字的數組時會發生這種情況 ( SELECT array(1, 'a') )。</p>
<h3><a name="t17"></a>1.4.3. 元組</h3>
<p style="text-indent:33px;">元組類型由1~n個元素組成,每個元素之間允許設置不同的數據類型,且彼此之間不要求兼容。元組同樣支持類型推斷,其推斷依據仍然以最小存儲代價為原則。與數組類似,元組也可以使用兩種方式定義,常規方式tuple(T)。</p>
<p style="text-indent:33px;">元素類型和泛型的作用類似,可以進一步保障數據質量。在數據寫入的過程中會進行類型檢查。Tuple(T1, T2, ...):元組,其中每個元素都有單獨的類型。</p>
<pre data-index="3"><code class="language-sql hljs"><ol class="hljs-ln" style="width:1086px"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> my_tuple_table (t Tuple(Int8, String, <span class="hljs-keyword">Array</span>(String), <span class="hljs-keyword">Array</span>(Int8))) ENGINE <span class="hljs-operator">=</span> TinyLog;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> my_tuple_table <span class="hljs-keyword">VALUES</span>((<span class="hljs-number">1</span>, <span class="hljs-string">'a'</span>, [<span class="hljs-string">'a'</span>, <span class="hljs-string">'b'</span>, <span class="hljs-string">'c'</span>], [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>])),(tuple(<span class="hljs-number">11</span>, <span class="hljs-string">'A'</span>, [<span class="hljs-string">'A'</span>, <span class="hljs-string">'B'</span>, <span class="hljs-string">'C'</span>], [<span class="hljs-number">11</span>, <span class="hljs-number">22</span>, <span class="hljs-number">33</span>]));</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">SELECT</span> t, t<span class="hljs-number">.2</span>, t<span class="hljs-number">.3</span>, t<span class="hljs-number">.4</span> <span class="hljs-keyword">FROM</span> my_tuple_table;</div></div></li></ol></code><div class="hljs-button {2}" data-title="復制" onclick="hljs.copyCode(event)"></div></pre>
<h3><a name="t18"></a>1.4.4. 嵌套類型 </h3>
<p style="text-indent:33px;">嵌套類型,顧名思義是一種嵌套表結構。一張數據表,可以定義任意多個嵌套類型字段,但每個字段的嵌套層級只支持一級,即嵌套表內不能繼續使用嵌套類型。對于簡單場景的層級關系或關聯關系,使用嵌套類型也是一種不錯的選擇。</p>
<p style="text-indent:33px;">嵌套Nested(Name1 Type1,Name2 Type2,…)</p>
<p style="text-indent:33px;">嵌套的數據結構就像一個嵌套的表。嵌套數據結構的參數 - 列名和類型 - 與在CREATE查詢中的指定方式相同。每個表的行可以對應于嵌套數據結構中的任意數量的行。</p>
<pre data-index="4"><code class="language-sql hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">drop</span> <span class="hljs-keyword">table</span> my_nest_table;</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TABLE</span> my_nest_table (</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">name String,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">age Int8,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">dept Nested(</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">id UInt8,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">name String</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">ENGINE <span class="hljs-operator">=</span> TinyLog;</div></div></li></ol></code><div class="hljs-button {2}" data-title="復制" onclick="hljs.copyCode(event)"></div></pre>
<pre data-index="5"><code class="language-sql hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> my_nest_table <span class="hljs-keyword">values</span> (<span class="hljs-string">'張三'</span>, <span class="hljs-number">18</span>, [<span class="hljs-number">1</span>], [<span class="hljs-string">'大數據組'</span>]);</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">insert</span> <span class="hljs-keyword">into</span> my_nest_table <span class="hljs-keyword">values</span> (<span class="hljs-string">'李四'</span>, <span class="hljs-number">18</span>, [<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>],[<span class="hljs-string">'hadoop'</span>,<span class="hljs-string">'spark'</span>,<span class="hljs-string">'flink'</span>]);</div></div></li></ol></code><div class="hljs-button {2}" data-title="復制" onclick="hljs.copyCode(event)"></div></pre>
<h2><a name="t19"></a>1.5.其它類型</h2>
<h3><a name="t20"></a>1.5.1. Nullable(TypeName)</h3>
<p style="text-indent:33px;">準確來說,Nullable 并不能算是一種獨立的數據類型,它更像是一種輔助的修飾符,需要與基礎數據類型一起搭配使用。Nullable 類型與 Java8 的 Optional 對象有些相似,它表示某個基礎數據類型可以是Null 值。</p>
<p style="text-indent:33px;">許用特殊標記 (NULL) 表示 "缺失值",可以與 TypeName 的正常值存放一起。例如,Nullable(Int8) 類型的列可以存儲 Int8 類型值,而沒有值的行將存儲 NULL。</p>
<p style="text-indent:33px;">特點:</p>
<blockquote>
<p style="text-indent:0;">1、Nullable 只能和基本類型搭配使用;<br> 2、不能使用在 Array/Tuple 這種復合類型上;<br> 3、不能作為索引字段【Order by()】;<br> 4、慎用 Nullable ,寫入寫出性能不好。因為它會生成單獨的文件。</p>
</blockquote>
<pre data-index="6"><code class="language-sql hljs"><ol class="hljs-ln" style="width:100%"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> null_test(</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> c1 String,</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> c2 Nullable(UInt8)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">) engine <span class="hljs-operator">=</span> TinyLog;</div></div></li></ol></code><div class="hljs-button {2}" data-title="復制" onclick="hljs.copyCode(event)"></div></pre>
<p style="text-indent:33px;">在使用 Nullable 類型的時候還有兩點值得注意:首先,它只能和基礎類型搭配使用,不能用于數組和元組這些復合類型,也不能作為索引字段;其次,應該慎用 Nullable 類型,包括 Nullable 的數據表,不然會使查詢和寫入性能變慢。因為在正常情況下,每個列字段的數據會被存儲在對應的 [Column].bin文件中。如果一個列字段被Nullable 類型修飾后,會額外生成一個 [Column].null.bin 文件專門保存它的 Null 值。這意味著在讀取和寫入數據時,需要一倍的額外文件操作。</p>
<h3><a name="t21"></a>1.5.2. Domain</h3>
<p style="text-indent:33px;">域名類型分為 IPv4 和 IPv6 兩類,本質上它們是對整型和字符串的進一步封裝。IPv4 類型是基于UInt32 封裝的,它的具體用法如下所示:</p>
<p style="text-indent:33px;">分為 IPv4 IPv6 。其實本質都是對整型,字符串進行的封裝。</p>
<blockquote>
<p style="text-indent:0;">IPv4 使用 UInt32 存儲。如116.253.40.133<br> IPv6 使用 FixedString(16) 存儲。如2a02:aa08:e000:3100::2</p>
</blockquote>
<p style="text-indent:33px;">問題:為什么不直接使用字符串來代替 IPv4 類型呢?</p>
<blockquote>
<p style="text-indent:0;">1、出于便捷性的考量,例如IPv4類型支持格式檢查,格式錯誤的IP數據是無法被寫入的<br> 2、出于性能的考量,同樣以IPv4為例,IPv4使用UInt32存儲,相比String更加緊湊,占用的空間更小,查詢性能更快。IPv6類型是基于FixedString(16)封裝的,它的使用方法與IPv4別無二致</p>
</blockquote>
<p style="text-indent:33px;">在使用Domain類型的時候還有一點需要注意,雖然它從表象上看起來與String一樣,但Domain類型并不是字符串,所以它不支持隱式的自動類型轉換。如果需要返回IP的字符串形式,則需要顯式調用IPv4NumToString或IPv6NumToString函數進行轉換。</p>
<h3 style="text-indent:0px;"><a name="t22"></a>1.5.3.default</h3>
<blockquote>
<p>c1 DEFALUT 100 給定默認值 根據這個來判斷類型</p>
<p>c2 String DEFALUT c1 c2類型是String,c2的默認值是c1的</p>
</blockquote>
<p style="text-indent:0;"> </p>
</div><div data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/Yuan_CSDF/article/details/117574866","extend1":"pc","ab":"new"}"><div></div></div>
</div>