前台页面验证中需要注意的一个与VARCHAR2(N BYTE)和VARCHAR2(N CHAR)的小细节
1:一個小的測試實例
CREATE TABLE SALES.TEST_ (TEST_BYTE VARCHAR2(5 BYTE),TEST_CHAR VARCHAR2(5 CHAR) )--TABLE CREATEDINSERT INTO TEST_ (TEST_CHAR) VALUES('12345')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_BYTE) VALUES('12345')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_CHAR) VALUES('abcde')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_BYTE) VALUES('abcde')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_CHAR) VALUES('@#$%&')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_BYTE) VALUES('@#$%&')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_CHAR) VALUES('1a@_好')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_BYTE) VALUES('1a@_好')--ORA-12899: value too large for column "SALES"."TEST_"."TEST_BYTE" (actual: 7, maximum: 5)INSERT INTO TEST_ (TEST_CHAR) VALUES('一二三四五')--1 ROW INSERTEDINSERT INTO TEST_ (TEST_BYTE) VALUES('一二三四五')--ORA-12899: value too large for column "SALES"."TEST_"."TEST_BYTE" (actual: 15, maximum: 5)2:實例的說明
從上面的例子中我們已經看到了比較的明顯的區別,對于VARCHAR2(5 BYTE)和VARCHAR2(5 CHAR)當插入的字符個數為五且其中有中文時或者是全是中文時就報錯!所以在前臺頁面做有關長度的控制和驗證時,必須注意!如果數據庫中定義的是VARCHAR2(N CHAR),則定義的是幾前臺頁面控制最大字符個數是幾就行了,如果數據庫中定義的是VARCHAR2(N BYTE),則必須根據數據庫默認的字符集結合NLS_LENGTH_SEMANTICS的值和是否有可能輸入中文來控制!上述實例報錯的原因很明確,但是為什么報這樣的錯誤呢?
首先要明確以下個點:
1)VARCHAR2(N CHAR)是指允許最大N個字符的存儲,與BYTE的個數無關
2)VARCHAR2(5 BYTE)是指只允許最大N個BYTE長度的字符存儲,和字符的個數無關
3)從9i開始,oracle提供了NLS_LENGTH_SEMANTICS這個參數,其有兩個取值,CHAR和BYTE。當為CHAR時字符類型的長度是按字符個數來計算,而不是按BYTE來計算,這在使用變長字符集(AL32UTF8)的情況下非常有用,因為一個字符所占用的字節數是不定的,就給我們準確估計字段長度(BYTE)帶來不便。同時當為CHAR時,對那些采用7/8bit的字符集(US7ASCII/WE8MSWIN1252)來說也不會帶來空間上的浪費。
4)我的數據庫是ORACLE 10 G?NLS_LENGTH_SEMANTICS默認值是BYTE(如下圖所示)
?
5)我的字符集是AMERICAN_AMERICA.AL32UTF8
SELECT USERENV('LANGUAGE') FROM DUAL--AMERICAN_AMERICA.AL32UTF8或者使用下面的SQL語句查詢
SELECT * FROM NLS_DATABASE_PARAMETERS;6)對于AMERICAN_AMERICA.AL32UTF8字符集,一個漢字占三個字節,一個字母、數據或特殊字符占一個字節(實驗顯示)
根據以上六點需要明確的知識點,上面報錯的原因就一目了然了!
參考:
1:http://www.2cto.com/database/201304/203337.html
2:http://blog.sina.com.cn/s/blog_69e55cc20100svty.html
3:http://www.oracle-base.com/articles/9i/character-semantics-and-globalization-9i.php
轉載于:https://www.cnblogs.com/godtrue/p/3782443.html
總結
以上是生活随笔為你收集整理的前台页面验证中需要注意的一个与VARCHAR2(N BYTE)和VARCHAR2(N CHAR)的小细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL 创建索引的作用以及如何创建索引
- 下一篇: 分页数据的新展示方式---瀑布流