原来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个字节。
所以字符集的问题总是一个热点问题,客户端的设置也尤为重要,需要考虑字符集的兼容性。
- [编程经验] 基于bs4的拉勾网AI相关工作爬虫实现
- [编程经验] 链家23个全国主要城市的现房数据分析
- [编程经验] Python中的modlue和packages的区别
- Day5上午解题报告
- [编程经验] Pandas中比较好用的几个方法
- [编程经验] Elasticsearch 初识
- 2017.10.26水题大作战部分题解
- 2017.10.27涩会题大乱斗部分题解
- 【 关关的刷题日记50】 Leetcode 345. Reverse Vowels of a String
- Day1上午解题报告
- 【 关关的刷题日记51】 Leetcode 67. Add Binary
- 【 关关的刷题日记53】 Leetcode 100. Same Tree
- Day1下午解题报告
- 【关关的刷题日记54】Leetcode 226. Invert Binary Tree
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法