SQL> select length('哈哈') from dual;LENGTH('哈哈')
--------------
4SQL> select lengthb('哈哈') from dual;LENGTHB('哈哈')
---------------
4
--这里为什么两次都是4呢 第一回的结果不是应该是2才对吗SQL>SQL> select length('哈哈哈') from dual;LENGTH('哈哈哈')
----------------
6SQL> select length('你好') from dual;
ERROR:
ORA-01756: quoted string not properly terminated
SQL> select length('呵呵') from dual;
ERROR:
ORA-01756: quoted string not properly terminated--这里为什么length中用'哈哈'可以 而用'呵呵'和'你好'就会报错
--------------
4SQL> select lengthb('哈哈') from dual;LENGTHB('哈哈')
---------------
4
--这里为什么两次都是4呢 第一回的结果不是应该是2才对吗SQL>SQL> select length('哈哈哈') from dual;LENGTH('哈哈哈')
----------------
6SQL> select length('你好') from dual;
ERROR:
ORA-01756: quoted string not properly terminated
SQL> select length('呵呵') from dual;
ERROR:
ORA-01756: quoted string not properly terminated--这里为什么length中用'哈哈'可以 而用'呵呵'和'你好'就会报错
解决方案 »
- 关于使用sql语句实现插入4000字符到CLOB字段的方式
- 建立存储过程时报错,求解答。在线等
- 菜鸟问题
- oracle 判断varchar2类型是不是为空'' ,用什么判断符
- 触发器报错
- 存储过程的in out参数如何处理???
- Oracle Http Server启动不正常的问题!
- 求救!
- 怎样把数据库中的所有索引从一台机器导到另一台机器中?
- ...where name = 'xx' or name = 'yy' or name = 'zz' 是否可以写成类似于 where name in( 'xx' ,'yy', 'zz')这样的结构?
- oracle查看当前用户的所创建的所有表的信息
- oracle的date字段插入
我是可以的
SQL> select length('你好') from dual;LENGTH('你好')
--------------
2SQL> select lengthb('你好') from dual;LENGTHB('你好')
---------------
6不过为什么lengthb是6呢
A和B两个字符集吧A中的哈哈在B中有对应的转换
A中的呵呵和你好在B中都不行呵呵 纯属猜测哦
不过情况和你一样
SQL> select length('你好') from dual;LENGTH('你好')
--------------
2SQL> select lengthb('你好') from dual;LENGTHB('你好')
---------------
6嗯。。我仔细想想
SQL> create table tt2(name varchar2(20));Table created.SQL> insert into tt2 values('哈哈');1 row created.
SQL> col dump(name) format a20
SQL> select name,dump(name) from tt2;NAME DUMP(NAME)
-------------------- --------------------
哈哈 Typ=1 Len=4: 185,254
,185,254--上面的这些实验是在NLS_LANG设置为AMERICAN_AMERICA.UTF8时做的
--下面我重新开个cmd窗口 set NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
SQL> insert into tt2 values('哈哈');已创建 1 行。SQL> commit;--这个时候再进行查询 注意看两次dump的长度是不一样的
SQL> select name,dump(name) from tt2;NAME DUMP(NAME)
-------------------- --------------------
鍝堝搱 Typ=1 Len=6: 229,147
,136,229,147,136哈哈 Typ=1 Len=4: 185,254
,185,254
SQL>在SIMPLIFIED CHINESE_CHINA.ZHS16GBK环境下插入的哈哈长度为6
而在AMERICAN_AMERICA.UTF8环境下插入的哈哈则为4
现在关于长度的问题已经完全搞懂了
还剩下一个问题就是
SQL> select length('哈哈哈') from dual;LENGTH('哈哈哈')
----------------
6SQL> select length('你好') from dual;
ERROR:
ORA-01756: quoted string not properly terminated
SQL> select length('呵呵') from dual;
ERROR:
ORA-01756: quoted string not properly terminated--这里为什么length中用'哈哈'可以 而用'呵呵'和'你好'就会报错呢?
C:\>set nls_lang=AMERICAN_AMERICA.zhs16CGB231280
C:\>sqlplus user/password@server1
SQL> create table t1 (c2 varchar2(10));
Table created.
SQL> insert into t1 values('昇大案');
1 row created.
SQL> insert into t1 values('喆');
ERROR:
ORA-01756: quoted string not properly terminated
SQL> insert into t1 values('喆2');
1 row created.
SQL> insert into t1 values('喆 ');
1 row created.
SQL> insert into t1 values('大 ');
1 row created.
SQL> select c2,length(c2) from t1;
C2 LENGTH(C2)
---------- ----------
昇大案 4
喆2 2
喆 2
大 2
SQL> select c2||'#',trim(c2)||'#' from t1;
C2||'#' TRIM(C2)||'
----------- -----------
昇大案# 昇大案#
喆2# 喆2#
喆 # 喆 #
大 # 大#
--如在客户端将字符集改为zhs16gbk,则结果是:
C:\>set nls_lang=SIMPLIFIED CHINESE_CHINA.zhs16gbk
C:\>sqlplus user/password@server1
SQL> delete t1;
已删除4行。
SQL> insert into t1 values('昇大案');
已创建 1 行。
SQL> insert into t1 values('喆');
已创建 1 行。
SQL> insert into t1 values('喆2');
已创建 1 行。
SQL> insert into t1 values('喆 ');
已创建 1 行。
SQL> insert into t1 values('大 ');
已创建 1 行。
SQL> select c2,length(c2) from t1;
C2 LENGTH(C2)
-------------------- ----------
?大案 3
? 1
?2 2
? 2
大 2
SQL> select c2||'#',trim(c2)||'#' from t1;
C2||'#' TRIM(C2)||'#'
---------------------- ----------------------
?大案# ?大案#
?# ?#
?2# ?2#
? # ?#
大 # 大#