1:一个小的测试实例

CREATE TABLE SALES.TEST_
(
TEST_BYTE VARCHAR2(5 BYTE),
TEST_CHAR VARCHAR2(5 CHAR)
)--TABLE CREATED INSERT INTO TEST_ (TEST_CHAR) VALUES('')--1 ROW INSERTED INSERT INTO TEST_ (TEST_BYTE) VALUES('')--1 ROW INSERTED INSERT INTO TEST_ (TEST_CHAR) VALUES('abcde')--1 ROW INSERTED INSERT INTO TEST_ (TEST_BYTE) VALUES('abcde')--1 ROW INSERTED INSERT INTO TEST_ (TEST_CHAR) VALUES('@#$%&')--1 ROW INSERTED INSERT INTO TEST_ (TEST_BYTE) VALUES('@#$%&')--1 ROW INSERTED INSERT INTO TEST_ (TEST_CHAR) VALUES('1a@_好')--1 ROW INSERTED INSERT 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 INSERTED INSERT 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

前台页面验证中需要注意的一个与VARCHAR2(N BYTE)和VARCHAR2(N CHAR)的小细节的更多相关文章

  1. springboot+thymeleaf中前台页面展示中、将不同的数字替换成不同的字符串。使用条件运算符

    主要用到的知识就是thyme leaf中的条件运算符 表达式:(condition)?:then:else 当条件condition成立时返回then.否则返回else 具体代码:<td th: ...

  2. 关于页面布局中,如何让一个div水平和垂直居中的五个方案

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. java中 try catch finally和return联合使用时,代码执行顺序的小细节

    代码1测试 public static void main(String[] args) { aa(); } static int aa() { try { int a=4/0; } catch (E ...

  4. MVC前台页面做登录验证

    最近接触了一个电商平台的前台页面,需要做一个登录验证,具体情况是:当用户想要看自己的订单.积分等等信息,就需要用户登录之后才能查询,那么在MVC项目中我们应该怎么做这个前台的验证呢? 1.我在Cont ...

  5. 使用spring webflow,在前台页面中如何显示后端返回的错误信息

    刚刚接触spring webflow,相关的资料并不是很多,并且大都是那种入门的 .xml文件的配置. 用到的CAS 最新的4.0版本用的就是web-flow流,前台页面使用的是表单提交.于是我就碰到 ...

  6. 我的第一个python web开发框架(18)——前台页面与接口整合

    由于我们前后台系统没有分开,所以前台页面调用接口时,可以直接使用后台管理系统已经完成的接口,不过后台管理系统接口的访问加上了登录验证,所以需要将前台要用到的接口进行处理,让它们设置到白名单当中 我们打 ...

  7. EF更新,数据库值变化,前台页面并不变化,刷新也不变化,重新运行程序则变化----开发中遇到的问题(已解决)

    首先说一下我遇到这个情况的代码情景,首先上错误代码 UserInfo userInfo = Session["UserInfo"] as UserInfo; ); 这段代码所呈现的 ...

  8. ASP.NET MVC中从后台控制器(Controller)传递数据到前台页面视图(View)方式

    方式一: 数据存储模型Model: public class CalendarEvent { public string id { get; set; } public DateTime start ...

  9. 为KindEditor编辑器中的内容添加样式,使得自己定义前台页面显示效果与编辑器效果一致

    KindEditor 本身自带有一定的样式,且为内部样式,在使用过程中,难免会发现部分效果不是我们想要的,因此.KindEditor提代了两种方式供使用着调用 1.内部样式.通过 cssData 属性 ...

随机推荐

  1. python安装psycopg2

    vim ~/.bash_profile export PATH=/Applications/Postgres.app/Contents/Versions/9.4/bin/:$PATH pip inst ...

  2. makefile详解 嵌套执行make,定义命令包

    嵌套执行make 在一些大的工程中,我们会把我们不同模块或是不同功能的源文件放在不同的目录中,我们可以在每个目录中都书写一个该目录的Makefile,这有利于让我们的Makefile变得更加地简洁,而 ...

  3. Python处理Excel文档(xlrd, xlwt, xlutils)

    简介 xlrd,xlwt和xlutils是用Python处理Excel文档(*.xls)的高效率工具.其中,xlrd只能读取xls,xlwt只能新建xls(不可以修改),xlutils能将xlrd.B ...

  4. TCP程序设计

        在Java中使用Socket(套接字)完成TCP程序的开发,使用此类可以方便地建立可靠的.双向的.持续的.点对点的通信连接.     在Socket的程序开发中,服务器端使用ServerSoc ...

  5. linux下如何不编译opencv的某些模块

    opencv非常庞大,有很多模块,但大部分情况我们可能只会用到三四个模块,此时如果还是直接cmake . & make,将会非常费时,尤其是部署时很麻烦. 所以需要去除掉一些不需要的模块,可参 ...

  6. Java多线程之后台线程

    将线程设置成后台线程Daemons 主线程结果后,后台线程将自动结果. package wzh.test; import java.util.concurrent.TimeUnit; class Si ...

  7. 使用系统UITabbarItem自定义图片显示原本颜色和自定义文字颜色

    ...... ThirdViewController *thirdVC = [[ThirdViewControlleralloc]initWithTitle:@"搜索信息"]; / ...

  8. Eclipse中Build Workspace 优化

    在开发中,发现eclipse 的 Build Workspace 很慢很慢,只要是由于验证js, css, xml 等等静态的文件导致. 我遇到的问题是,项目中有一个js文件很大,怎么都不能Build ...

  9. 计算机硬件——pci卡图片

    搞IT的还是软硬都要了解的好.1. PCI插槽 2. PCI-E 3. PCI-X 4. mini PCI  

  10. EDE,DEDE网站搬家,DEDECMS搬家教程,一看就会

    无聊做个小教程:DEDE搬家,本人提供搬家 先来说下DEDE 大家会安装吧,不多说,看图 一.进入织梦DedeCms的后台备份数据库 步骤:系统 –> 数据库备份/还原 -> 全选有所织梦 ...