原来Oracle也不喜欢“蜀黍"(r6笔记第54天)

今天在部署一个脚本的时候,碰到了一个奇怪的问题,脚本运行过程中报了一个ora错误 ORA-01756: quoted string not properly terminated

看这个错误似乎是哪里的标点符号出了问题,没有正确结束,本来这个问题看起来很明显,很可能是格式的问题,但是奇怪的是插入中文,有的语句可以,有的就不可以。 我们先来看看环境变量的设置,然后复现一下这个问题 $ echo $NLS_LANG American_America.zhs16gbk $ locale LANG=en_US LC_CTYPE="en_US" LC_NUMERIC="en_US" LC_TIME="en_US" LC_COLLATE="en_US" LC_MONETARY="en_US" LC_MESSAGES="en_US" LC_PAPER="en_US" LC_NAME="en_US" LC_ADDRESS="en_US" LC_TELEPHONE="en_US" LC_MEASUREMENT="en_US" LC_IDENTIFICATION="en_US" LC_ALL= 查看数据库字符集 SQL> select *from database_properties where property_name='NLS_CHARACTERSET' PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ------------------------------ ------------------------------ ------------------------------ NLS_CHARACTERSET ZHS16GBK Character set 复现问题 创建一个临时表test,然后向里面插入两条记录 SQL> create table test(id number,title varchar2(20)); Table created. 第一条记录没有问题 SQL> insert into test values(1,'你好'); 1 row created. 当尝试插入“蜀黍”的时候就爆了格式错误,难道Oracle不喜欢这种称谓? SQL> insert into test values(2,'蜀黍'); ERROR: ORA-01756: quoted string not properly terminated 如果在后面加一个空格,就可以了 SQL> insert into test values(2,'蜀黍 '); 1 row created. 我们来简单看一下,是否那个空格还在那儿。 SQL>select '>'||title||'<',id from test '>'||TITLE||'<' ID ---------------------- ---------- >蜀黍 < 2 还不甘心,决定使用trim来格式化一下,语句运行成功,但是没有效果,空格还在那儿。 删除第一条记录,注意力就关注在 delete from test where id=1; SQL> update test set title=trim(title); 1 row updated. SQL> select '>'||title||'<',id from test; '>'||TITLE||'<' ID ---------------------- ---------- >蜀黍 < 2 以上的方法和测试都不见效,那就使出大招,看看dump的结果 SQL> select dump(title) from test; DUMP(TITLE) -------------------------------------------------------------------------------- Typ=1 Len=7: 232,156,128,233,187,141,32 可以看到末尾显示是32,是一个空格 SQL> select '>'||chr(32)||'<' from dual; '>' --- > <

整个字符串占用了7个字节,空格占用一个,即每个汉字占用3个,这个方式应该是在字符集为UTF-8的情况

查看客户端中设置的字符集,还确实就是UTF-8 修改secureCRT的字符集为默认的方式,即支持中文,然后再次插入,就没有问题了。 SQL> insert into test values(2,'蜀黍 '); 1 row created. 这个时候重新审视数据,发现原来插入的那条记录已经显示为乱码了。说明最开始插入就有字符集的问题了。 SQL> select * from test; ID TITLE ---------- -------------------- 2 铚?榛? 2 蜀黍 使用dump的方式可以看到两者还是有着天壤之别。 SQL> select dump(title) from test; DUMP(TITLE) -------------------------------------------------------------------------------- Typ=1 Len=7: 232,156,128,233,187,141,32 Typ=1 Len=5: 202,241,202,242,32 这个时候我们再来看一看dump的结果,可以看到在UTF-8的情况是每个汉字占用3个字节,在GBK模式下,是占用2个字节。 所以字符集的问题总是一个热点问题,客户端的设置也尤为重要,需要考虑字符集的兼容性。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-09-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

PL/SQL-->UTL_FILE包的使用介绍

    在PL/SQL中,UTL_FILE包提供了文本文件输入和输出互功能。也就是说我们可以通过该包实现从操作系统级别来实现文件读取输入或者是写入到操作系统文件...

10110
来自专栏用户2442861的专栏

基于bootstrap的web登陆实例

前情提要 之前已经搭好的springMVC+myBatis项目骨架,详情请看–>传送门。

1.1K10
来自专栏JAVA后端开发

结合swagger,实现shiro权限资源的导入功能

做shiro权限控制时,shiro的权限RequiresPermissions都写在Controller的方法内,如果做动态的权限管理时,每个shiro的权限资...

31640
来自专栏文渊之博

用于重新编译的工具和命令

1.SQL Prifiler:捕捉事件类型为SP和T-SQL的事件(Starting、Stmtcompleted、Recompile、Completed、Cac...

22490
来自专栏乐沙弥的世界

使用datapump 导出导入同义词(export and import synonym using datapump)

      对于同义词的备份我们有多种方式来实现,如直接通过脚本生成同义词的创建脚本,或者使用dbms_metadata.get_ddl来提取同义词的定义脚本。...

13130
来自专栏数据库新发现

字符集问题的初步探讨(二)

原文发表于itpub技术丛书《Oracle数据库DBA专题技术精粹》,未经许可,严禁转载本文.

13820
来自专栏数据小魔方

时间&日期函数

今天要跟大家简要介绍一下excel中经常会用到的日期与时间函数! 日期与时间类的函数虽然算所有函数中最难掌握的,但是因为格式众多,形式多样,而且作为其他高级函数...

33870
来自专栏杨建荣的学习笔记

简单实用的sql小技巧(第一篇) (r3笔记第36天)

今天和大家简单分享几个实用的sql小技巧。还有一些还在整理中,会不断的分享出来。 有些其实也不算是sql的技巧,可能大家在写sql语句的时候没有意识到我们可以通...

31230
来自专栏乐沙弥的世界

PL/SQL -->隐式游标(SQL%FOUND)

在PL/SQL中,游标的使用分为两种,一种是显示游标,一种是隐式游标,显示游标的使用需要事先使用declare来进行声明,其过程包括

10530
来自专栏「3306 Pai」社区

《那些年,我在乙方的日子 -- 神谕篇NO1》

某个夏日的午后,窗外知了在大声鸣叫。而我却在睡梦中跟基友一起吃鸡,正准备抢空投时 。手机突然铃声响起,惊醒后一看是领导电话,一下子回到了现实中。心想又得去公司吃...

18220

扫码关注云+社区

领取腾讯云代金券