redhat系统,oracle数据
从数据库表中取出一个字段,该字段中有汉字,如“操作系统勍”,然后将其插入到另一张表中去,结果就变成了“操作系统??”,我在从数据库中取出来后打印了下,在这时就已经变成了?...
从数据库表中取出一个字段,该字段中有汉字,如“操作系统勍”,然后将其插入到另一张表中去,结果就变成了“操作系统??”,我在从数据库中取出来后打印了下,在这时就已经变成了??了,这时问什么啊,为什么有的汉字能正常读出而有些又不能,请大侠指点啊,急啊,纠结好久了!!
展开
展开全部
字符集的问题。
字符集分:oracle数据库字符集和客户端工具字符集。
以下几种情况:
1、数据库和客户端字符集一致。这是最理想。如果存进去,显示不出来,应该是数据库的字符集不包含您这个特殊的汉字。
2、数据库和客户端字符集不一致时,又分:
A、客户端使用的字符集大于数据库使用的字符集。这时候一般存到数据库里就是错的。显示出来是否正确取决于:
(1)、插入时使用的客户端和显示时使用的客端一致。一般还会正常显示。
(2)、插入时使用的客户端和显示时使用的客端不一致。一般不会正常显示
B、客户端使用的字符集小于数据库使用的字符集,一般数据库会主动进行转换。但也要考虑插入时使用的字符集和显示时使用的字符集是否一致。
3、您这种情况考虑两张表的数据类型是否一致。
A、原表如果使用nvarchar2,因为他支持本地语言,所以正常。
B、如果目标表使用varchar2,它取决于数据库字符集的设定。所以保证两个表的数据类型是否一致。
字符集分:oracle数据库字符集和客户端工具字符集。
以下几种情况:
1、数据库和客户端字符集一致。这是最理想。如果存进去,显示不出来,应该是数据库的字符集不包含您这个特殊的汉字。
2、数据库和客户端字符集不一致时,又分:
A、客户端使用的字符集大于数据库使用的字符集。这时候一般存到数据库里就是错的。显示出来是否正确取决于:
(1)、插入时使用的客户端和显示时使用的客端一致。一般还会正常显示。
(2)、插入时使用的客户端和显示时使用的客端不一致。一般不会正常显示
B、客户端使用的字符集小于数据库使用的字符集,一般数据库会主动进行转换。但也要考虑插入时使用的字符集和显示时使用的字符集是否一致。
3、您这种情况考虑两张表的数据类型是否一致。
A、原表如果使用nvarchar2,因为他支持本地语言,所以正常。
B、如果目标表使用varchar2,它取决于数据库字符集的设定。所以保证两个表的数据类型是否一致。
追问
我查看了下,他在从数据库中取出来的时候“勍”字就变成了"??",再insert时就是插入的"??",这是不是应该是当前字符集中不包含"勍"字?
追答
是的。取出来就变成??说明客户端环境不支持这个字符集。再插入更不支持。
如果非要插入,可以用select into / insert into select 语句。别经过客户端转换
力控科技
2024-08-19 广告
2024-08-19 广告
ForceSCADA是力控科技信创产品的重要组成部分,具备完全自主知识产权,支持部署在Linux桌面版、服务器版、嵌入式等系统架构下。使用ForceSCADA可以搭建创新性高、扩展性佳、融合度强的SCADA平台,进而构建高效、智能化的监控中...
点击进入详情页
本回答由力控科技提供
展开全部
勍字在GBK标准里,而不在GB2312标准里,所以如果客户端的字符集是GB2312的话就无法显示该字了。
可把客户端的NLS_LANG改为'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
windows版的客户端,可修改注册表:
32位客户端安装在64位系统时:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient10g_home1]
"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
32位客户端安装在32位系统时:
[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1]
"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
linux的客户端,直接在.profile里设置NLS_LANG环境变量即可
可把客户端的NLS_LANG改为'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
windows版的客户端,可修改注册表:
32位客户端安装在64位系统时:
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient10g_home1]
"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
32位客户端安装在32位系统时:
[HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1]
"NLS_LANG"="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
linux的客户端,直接在.profile里设置NLS_LANG环境变量即可
追问
AMERICAN_AMERICA.ZHS16GBK这个字符集中包含“勍”字吗,NLS_LANG是设置的这个字符集
追答
“勍”字肯定在GBK字符集里,确认你的数据库Server端也是GBK字符集(或UTF8也行)
就包含的字符数而言, UTF8 > GBK > GB2312
UTF8有4万多字符(全球大字符集),GBK有2万多(已包含中简、中繁、日、韩等字符集),GB2312只有6000多
一般来说,Server端的字符集必须大于或等于Client端的字符集(最好是相等)
Server Client
UTF8 UTF8
UTF8 GBK
UTF8 GB2312
GBK GBK
GBK GB2312
GB2312 GB2312
以上的组合都是可行的,这时,Client写入的所有字符都能被Server接受,但反过来就不一定了。例如“勍”字在Server端字符集为UTF8、GBK时能够正确保存,但若Client设为GB2312时,从数据库里读出来就会被转换成??
根据你的情况看,应该是客户端的字符集不对吧,是java程序还是c/c++程序?或者是哪一种数据库管理软件?
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询