oracle如何插入特殊符号
select '†',ascii('†'),dump('†') from dual
请教下这种十字架的特殊符号怎么插入到表里面啊
有2个库,一个AL32UTF8 一个ZHS16GBK


我来答
添加附件
收藏
复制链接
微信扫码分享
在小程序上查看
分享
添加附件
问题补充
6条回答
默认
最新
1.如果数据库是AL32UTF8,那么客户端环境变量也要设置成AL32UTF8
NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8
2.如果数据库是ZHS16GBK,那么这个字符只能存进NVARCHAR2类型的字段中了,否则就只能转换成其他码点来进行存储,比如应用转换成unicode编码,再存进来
这篇文章最后面刚好有类似的场景
https://www.modb.pro/db/530818
评论
有用 0
还是要说清楚的吧,这个看了会让人觉得NLS_LANG就要和数据库字符集一样的设置。
而且提问里边只说了有2个库,一个AL32UTF8 一个ZHS16GBK,没说客户端字符集。
好像PLSQLDEV这个工具是有自己的字符集的吧。
另外你说的这个方法,你试试对windows上边的sqlplus客户端是有问题的,某些特殊字符在通过sqlplus服务器送进去数据库的时候已经丢失了编码信息(无论NLS_LANG怎么设置),因为windows console的界面936字符集不支持某些特殊字符。
如果是服务器上sqlplus,一般服务器OS的字符集是UTF8那就没问题,此时NLS_LANG设置为AMERICAN_AMERICA.AL32UTF8。
https://www.cnblogs.com/PiscesCanon/p/15157506.html
回答是为了解决题主的问题,题主问的是两个字符集的库怎么存这个特殊符号,所以回答就分了两种场景,AL32UTF8时怎么存,ZHS16GBK怎么存。另外PLSQLDEV使用的字符集就是操作系统环境变量NLS_LANG中设置的,从题主的截图来看,这个符号被识别成了问号,所以很明显此时客户端的字符集并不支持这个符号。而且题主通过其他渠道进行了咨询,测试过chr(14844064)能正确返回这个字符,因此可以确定题主的数据库字符集为AL32UTF8,是支持这个字符的,只是因为客户端字符集不支持这个字符导致的问题
windows cmd界面,可以通过chcp 65001调整,或者修改操作系统语言UNICODE支持,同样在linux下,也是可以配置SSH客户端字符集的,配置不对也可能引起问题,但这些都这与题主的问题无关
为了解决题主问题就试用“如果数据库是AL32UTF8,那么客户端环境变量也要设置成AL32UTF8”这种错误的说法,就算有特殊前提您也要没提一下(像是OGG),这个答案是多人阅读的。
另外,因为plsqldev会忽略ORA_NCHAR_LITERAL_REPLACE也可以存储特殊字符所以不明白这个工具内部做了什么其他设置,做10046可以看出有区别对待所以不确定这类工具内部太细节设定,当然NLS_LANG是对plsql生效的。一般我都用sqlplus。
65001我测试过印象会出现其他的问题比较久了我忘了,所以我才专门说936作为前提。
最后,您说的第一点,ALUTF8的数据库,按照您下边回复的,客户端是GBK,这些作为前提,设置NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8,我想问下,比如特殊'†',GBK下'†'乱码后信息都丢了存储在库里头不会有问题吗?
第一个建议有道理,回复问题前先重复一下问题,确保描述的完整性,只是我觉得这样信息冗余了,考试答题也不会再去重复一次问题,一般默认人都会先看问题再看答案,如果只看答案,获取了片面的信息,这个就无能为力了。NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8设置这个东西的含义,就是指定客户端字符集为AL32UTF8,题主之前设定的是NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK,所以才引起的错误,改了就好了
没看明白我说的一些地方,我直说了,您说的数据库字符集是UTF8,客户端字符集是GBK,设置NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8我认为是错误的,会导致进到数据库的特殊字符信息丢失。
您自己都说了NLS_LANG=SIMPLIFIED CHINESE_CHINA.AL32UTF8设置这个东西的含义,就是指定客户端字符集为AL32UTF8。
或者您看看下边我的发的截图。
PS:题主的问题就几句话附加图片,有提到类似“之前设定的是NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK”?
还是改过提问内容了?
可能您理解的客户端字符集和我理解的不一样,与这个字符集相关的,存在三个,数据库字符集、客户端字符集、代码页字符集(或文本文件字符集),您说的“客户端字符集”应该是指的代码页字符集,我说的客户端字符集是Oracle官方文档中的描述" It also indicates the client's character set",即NLS_LANG的设置,详见https://www.oracle.com/database/technologies/faq-nls-lang.html。关于题主之前设定的字符集,是在其他渠道确认的,评论发不了图片,等下我补充一下沟通记录
展开全部评论(5条)
select '†这个特殊的字符剑号怎么入库' from dual
是一段文字中有这个符号,不单单是一个符号,疾病目录里面
评论
有用 0采纳的答案有个地方误人子弟,NLS_LANG的设置跟数据库字符集没任何关系。
这年头还是有人搞不清楚。
评论
有用 0因为该题主数据库字符集是UTF8,客户端字符集是GBK,插入GBK字符到数据库中是没问题的,但不能插入非GBK字符集到数据库中,所以客户端字符集要设置成UTF8。也就是说,数据库字符集是UTF8,是插入这个字符的前提条件之一
具体分析可以看我这篇文章 https://www.modb.pro/db/240291
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
墨值悬赏












