<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 8.1\. 數值類型 數值類型由 2 、4 或 8 字節的整數以及 4 或 8 字節的浮點數和可選精度的小數組成。 [Table 8-2](#calibre_link-697)列出了所有可用類型。 **Table 8-2\. 數值類型** | 名字 | 存儲空間 | 描述 | 范圍 | | --- | --- | --- | --- | | `smallint` | 2 字節 | 小范圍整數 | -32768 到 +32767 | | `integer` | 4 字節 | 常用的整數 | -2147483648 到 +2147483647 | | `bigint` | 8 字節 | 大范圍整數 | -9223372036854775808 到 +9223372036854775807 | | `decimal` | 變長 | 用戶聲明精度,精確 | 小數點前 131072 位;小數點后 16383 位 | | `numeric` | 變長 | 用戶聲明精度,精確 | 小數點前 131072 位;小數點后 16383 位 | | `real` | 4 字節 | 變精度,不精確 | 6 位十進制數字精度 | | `double precision` | 8 字節 | 變精度,不精確 | 15 位十進制數字精度 | | `smallserial` | 2 字節 | 小范圍自增整數 | 1 到 32767 | | `serial` | 4 字節 | 自增整數 | 1 到 2147483647 | | `bigserial` | 8 字節 | 大范圍自增整數 | 1 到 9223372036854775807 | 數值類型常量的語法在[Section 4.1.2](#calibre_link-698)里描述。 數值類型對應有一套完整的數學操作符和函數。相關信息請參考[Chapter 9](#calibre_link-455)。 下面的幾節詳細描述這些類型。 ## 8.1.1\. 整數類型 `smallint`,`integer`和`bigint`類型存儲各種范圍的全部是數字的數, 也就是沒有小數部分的數字。試圖存儲超出范圍以外的數值將導致一個錯誤。 常用的類型是`integer`,因為它提供了在范圍、存儲空間、性能之間的最佳平衡。 一般只有在磁盤空間緊張的時候才使用`smallint`。 當`integer`的范圍不夠的時候才使用`bigint`。 SQL只聲明了整數類型`integer`(或`int`), `smallint`和`bigint`。類型`int2`, `int4` 和`int8`都是擴展,并且也在許多其它SQL數據庫系統中使用。 ## 8.1.2\. 任意精度數值 `numeric`類型可以存儲非常大的數字并且準確地進行計算。 我們特別建議將它用于貨幣金額和其它要求精確計算的場合。不過, `numeric`類型上的算術運算比整數類型或者我們下一節描述的浮點數類型要慢很多。 在隨后的內容里,我們使用下述術語:一個`numeric`類型的標度 (_scale_)是小數部分的位數,精度(_precision_) 是全部數據位的數目,也就是小數點兩邊的位數總和。 因此數字 23.5141 的精度為 6 而標度為 4 。你可以認為整數的標度為零。 `numeric`字段的最大精度和最大標度都是可以配置的。 要聲明一個字段的類型為`numeric`,你可以用下面的語法: ``` NUMERIC(_precision_, _scale_) ``` 精度必須為正數,標度可以為零或者正數。另外: ``` NUMERIC(_precision_) ``` 選擇了標度為 0 。不帶任何精度與標度的聲明 ``` NUMERIC ``` 則創建一個可以存儲一個直到實現精度上限的任意精度和標度的數值, 一個這樣類型的字段將不會把輸入數值轉化成任何特定的標度, 而帶有標度聲明的`numeric`字段將把輸入值轉化為該標度。 SQL標準要求缺省的標度是 0(也就是轉化成整數精度)。 我們覺得這樣做有點沒用。如果你關心移植性, 那你最好總是明確聲明精度和標度。 > **Note:** 當在類型聲明中顯示指定精度時允許的最大值為1000;沒有指定精度的 `NUMERIC`遵從[Table 8-2](#calibre_link-697)里的描述。 如果一個要存儲的數值的標度比字段聲明的標度高, 那么系統將嘗試圓整(四舍五入)該數值到指定的小數位。然后, 如果小數點左邊的數據位數超過了聲明的精度減去聲明的標度,那么將拋出一個錯誤。 numeric 類型的數據值在物理上是不帶任何前導或者后綴零的形式存儲的。 因此,字段上聲明的精度和標度都是最大值,而不是固定分配的。在這個方面, `numeric`類型更類似于`varchar(``_n_`)而不是 `char(``_n_`)。實際存儲是每四個十進制位兩個字節, 然后在整個數據上加上三到八個字節的額外開銷。 除了普通的數字值之外,`numeric`類型允許用特殊值`NaN` 表示"不是一個數字"。任何在`NaN`上面的操作都生成另外一個 `NaN`。如果在 SQL 命令里把這些值當作一個常量寫, 你必須在其周圍放上單引號,比如`UPDATE table SET x = 'NaN'`。 在輸入時,字符串`NaN`是大小寫無關的。 > **Note:** 在大多數"not-a-number"概念中,不認為`NaN`等于其他數值類型 (包括`NaN`)。為了能夠存儲`numeric`類型的值, 并且使用Tree索引,PostgreSQL認為`NaN`相等, 并且大于所有非`NaN`值。 類型`decimal`和`numeric`是等效的。 兩種類型都是SQL標準。 ## 8.1.3\. 浮點數類型 數據類型`real`和`double precision`是不精確的、變精度的數字類型。 實際上,這些類型是IEEE 754標準二進制浮點數算術(分別對應單和雙精度)的一般實現, 外加下層處理器、操作系統和編譯器對它的支持。 不精確意味著一些數值不能精確地轉換成內部格式并且是以近似值存儲的, 因此存儲后再把數據打印出來可能有一些差異。 處理這些錯誤以及這些錯誤是如何在計算中傳播的屬于數學和計算機科學的一個完整的分支, 我們不會在這里進一步討論它,這里的討論僅限于如下幾點: * 如果你要求精確的計算(比如計算貨幣金額),應使用`numeric`類型。 * 如果你想用這些類型做任何重要的復雜計算, 尤其是那些你對范圍情況(無窮/下溢)嚴重依賴的事情,那你應該仔細評詁你的實現。 * 拿兩個浮點數值進行相等性比較可能不像你想像那樣運轉。 在大多數平臺上,`real`類型的范圍是至少1E-37到1E+37, 精度至少是6位小數。`double precision`的范圍通常是1E-307到1E+308, 精度是至少15位數字。太大或者太小的數值都會導致錯誤。如果輸入數據的精度太高, 那么將會發生圓整。太接近零的數字,如果無法與零值的表現形式相區分就會產生下溢錯誤。 > **Note:** 當一個浮點數值轉化為文本輸出時,[extra_float_digits](#calibre_link-699) 設置控制額外有效數字的位數。默認值是`0`,PostgreSQL 支持的平臺上的輸出是一樣的。增加這個值產生的輸出將更精確的表示存儲值, 但是可能不利于移植。 除了普通的數字值之外,浮點類型還有幾個特殊值: `Infinity` `-Infinity` `NaN` 這些值分別表示 IEEE 754 特殊值"正無窮大"、"負無窮大"、 "不是一個數字"。在不遵循 IEEE 754 浮點算術的機器上, 這些值的含義可能不是預期的。如果在 SQL 命令里把這些數值當作常量寫, 你必須在它們周圍放上單引號,像這樣:`UPDATE table SET x = 'Infinity'`。 輸入時,這些值是以大小寫無關的方式識別的。 > **Note:** IEEE754聲明`NaN`不應該等于任何其他浮點值(包括`NaN`)。 為了能存儲浮點值,并且使用Tree索引,PostgreSQL認為`NaN` 相等,并且大于所有非`NaN`值。 PostgreSQL還支持 SQL 標準表示法`float` 和`float(``_p_`)用于聲明非精確的數值類型。 其中的`_p_`聲明以_二進制_位表示的最低可接受精度。 在選取`real`類型的時候,PostgreSQL接受 `float(1)`到`float(24)`,在選取`double precision` 的時候,接受`float(25)`到`float(53)`。 在允許范圍之外的`_p_`值將導致一個錯誤。 沒有聲明精度的`float`將被當作`double precision`。 > **Note:** PostgreSQL 7.4以前,在`float(``_p_`) 里面的精度會被當作是這么多_位數_的十進制位。到 7.4 已經被修改成與 SQL 標準匹配, 標準聲明這個精度是以二進制位度量的。假設`real`和`double precision` 分別有 24 和 53 個二進制位的位數對 IEEE 標準的浮點實現來說是正確的。在非 IEEE 平臺上, 這個數值可能略有偏差,但是為了簡化,我們在所有平臺上都用了同樣的`_p_`值范圍。 ## 8.1.4\. 序列號類型 `smallserial`,`serial`和`bigserial`類型不是真正的類型, 只是為在表中創建唯一標識做的概念上的便利。類似其它一些數據庫中的`AUTO_INCREMENT` 屬性。在目前的實現中,下面一個語句: ``` CREATE TABLE _tablename_ ( _colname_ SERIAL ); ``` 等價于聲明下面幾個語句: ``` CREATE SEQUENCE _tablename___colname__seq; CREATE TABLE _tablename_ ( _colname_ integer NOT NULL DEFAULT nextval('_tablename___colname__seq') ); ALTER SEQUENCE _tablename___colname__seq OWNED BY _tablename_._colname_; ``` 因此,我們就創建了一個整數字段并且把它的缺省數值安排為從一個序列發生器讀取。 應用了一個`NOT NULL`約束以確保 NULL 不會被插入。 在大多數情況下你可能還希望附加一個`UNIQUE`或`PRIMARY KEY` 約束避免意外地插入重復的數值,但這個不是自動的。最后, 將序列發生器"從屬于"那個字段,這樣當該字段或表被刪除的時候也一并刪除它。 > **Note:** 因為`smallserial`, `serial`和`bigserial` 是使用序列實現的,所以顯示在字段里的序列值可能有“漏洞”或者缺口,即使沒有列曾經被刪除。 一個從序列中分配的值仍然會“使用”,即使包含這個值的行沒有成功的插入到表格的字段中。 這種情況是有可能發生的,比如,插入事務回滾。參閱[Section 9.16](#calibre_link-700) 中的`nextval()`獲取詳細信息。 > **Note:** PostgreSQL 7.3以前,`serial`隱含`UNIQUE`。 但現在不再如此。如果你希望一個序列字段有一個唯一約束或者一個主鍵, 那么你現在必須聲明,就像其它數據類型一樣。 要在`serial`字段中插入序列中的下一個數值,主要是要注意`serial` 字段應該賦予缺省值。我們可以通過在`INSERT` 語句中把該字段排除在字段列表之外來實現,也可以通過使用`DEFAULT`關鍵字來實現。 類型名`serial`和`serial4`是等效的: 兩者都創建`integer`字段。類型名`bigserial`和`serial8` 也一樣,只不過它創建一個`bigint`字段。 如果你預計在表的生存期中使用的標識數目可能超過 2&lt;sup class="calibre28"&gt;31&lt;/sup&gt; 個, 那么你應該使用`bigserial`。類型名`smallserial`和 `serial2`也一樣,只不過它創建一個`smallint`字段。 一個`serial`類型創建的序列在所屬的字段被刪除的時候自動刪除。 你可以只刪除序列而不刪除字段,不過這將刪除該字段的缺省值表達式。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看