oracle字元儲存

2021-09-08 10:34:42 字數 1520 閱讀 5189



substr和substrb

以前知道有substrb,lengthb等函式,也知道它們是以byte來計算長度,可沒用過,也不太明白什麼地方需要用到它們。一直就是用substr,length,以字元來計算長度,在我看來varchar2和char裡面存的都是字元,那麼自然也就不可能以byte為單位來計算長度,也就用不到這些函式了,但事實證明我錯了。最近有個procedure出錯,往表裡insert時總是報1401錯誤,看了一下程式,覺得問題很奇怪,目標表出錯欄位的長度是50,insert的對應這個欄位的取法也是substr(**,1,50),怎麼會出錯呢?有些懷疑是漢字字元為雙位元組的原因,於是試著將substr(**,1,50)改為了substr(**,1,25),果然ok。上網找原因,在asktom上找到了解答。

資料庫裡的varchar2和char字段長度定義是有兩種方式,按位元組或按字元,按位元組定義長度的方式是varchar2(n byte)或者char(n byte),這也是預設的長度定義方式,也就是說,平時我們用到的varchar2(n)或者char(n)都是按位元組定義長度的,按字元定義長度的方式是varchar2(n char)或者char(n char),這樣的定義方式可以確保欄位有足夠的空間儲存需要的字元,無論這些字元的長度是多少位元組。我們遇到的這個錯誤的原因在於,資料庫的字符集是多位元組字符集,也就是說中文字元佔多個位元組,而源字段的內容都是中文,這樣substr(**,1,50)的位元組長度可能達到100,自然超過了目標表字段中的50了。

總結一些經驗和教訓,覺得在建表之前,如果某個字段需要儲存中文的話,最好明確一下字段需要的長度是否是按字元來決定的。如果是按字元並且資料庫字符集為多位元組,那建表時就應該採取按字元定義長度的方式來定義該字段的長度。

乙個漢字有幾個位元組?

依據編碼形式:

gb-231280 編碼為 2個位元組(byte) 包含了 20902 個漢字,其編碼範圍是 0x8140-0xfefe。

gb18030-2000(gbk2k) 在 gbk 的基礎上進一步擴充套件了漢字,增加了藏、蒙等少數民族的字形。編碼是變長的,其二位元組部分與 gbk 相容;四位元組部分是擴充的字形、字位,其編碼範圍是首位元組 0x81-0xfe、二位元組0x30-0x39、三位元組 0x81-0xfe、四位元組0x30-0x39

unicode 範圍一般所用為\u0000-\uffff,對於cjk ext b區漢字,範圍大於\u20000

utf, 按其基本長度所用位數分為utf-8/16/32。其中:

utf-8是變長編碼,每個unicode**點按照不同範圍,可以有1-3位元組的不同長度。

utf-16長度相對固定,只要不處理大於\u200000範圍的字元,每個unicode**點使用16位即2位元組表示,超出部分使用兩個utf-16即4位元組表示。按照高低位位元組順序,又分為utf-16be/utf-16le。

utf-32長度始終固定,每個unicode**點使用32位即4位元組表示。按照高低位位元組順序,又分為utf-32be/utf-32le。

一般用gb-231280 ,所以大多數情況下是佔2個位元組。

本文**:

ORACLE儲存過程判斷非法字元

呼叫方法 驗證非法字元 ismg fun issensitivity v arr if not ismg then v sendmsg 很好,你的資訊是正常的。else v sendmsg 對不起,您的資訊含有敏感字,請修改後再發!end if 中間過程 create or replace func...

Oracle儲存函式,儲存過程

一 oracle儲存函式 儲存的pl sql語法塊,完成特定的功能。1 語法 函式關鍵字 function 1 建立函式 create or replace function function name param1,param2 return is as local declarations de...

ORACLE儲存過程

自定義函式開始 create or replace function fn wftemplateidget templatecategoryid number,organid number,templatemode number return number istemplateid number i...