使用UTF8字符集存储中文生僻字
使用UTF8字符集存储中文生僻字
一、相关学习BLOG
https://www.cnblogs.com/jyzhao/p/8654412.html
http://blog.itpub.net/781883/viewspace-1411259/
https://www.qqxiuzi.cn/bianma/zifuji.php
https://blog.csdn.net/iteye_7853/article/details/82516888
二、需求详情:
客户提出,关于氮卓斯汀变更为氮䓬斯汀,系统出现乱码问题
产生问题的原因为:oracle数据库字符集为:ZHS16GBK,对于部分生僻字是无法正常保存的。
三、客户提出的解决方案:
1. 修改数据库字符集为:UTF-8。此方法需对oracle字符集进行修改,但修改后,可能会将原有数据全部变成乱码。
2. 程序改造:将所有会涉及到生僻字的字段(例如产品名称、通用名等),存入数据库时,转码为16进制存,然后读取时再进行解码后展示到页面。此方法涉及修改代码庞大,且数据库内容可读性很差,手动刷数据、导出数据难度也很大。
四、解决思路:
1)直接修改数据库字符集,除非是子集修改为超集,否则不建议修改,从上述链接blog可以发现强行将db字符集从gbk修改为utf8后,plsql登录提示存在字符不匹配现象;
2)应用程序修改,代码量大,且可读写性太差;
3)建议将生僻字业务表,迁移至utf8 db库中存储(与开发人员沟通,实际存储生僻字的表只有20余个,可以单独对这些表进行迁移,业务修改查询表的代码(通过db_link),或者直接连接新的db,再或者通过创建db_link+同义词指向迁移后的远程表进行查询不修改应用代码(应用不修改,无感知);
五、实验测试
1.测试环境导出业务表
2.导入到UTF8环境下,进行读写测试
5.1源环境导出
修改字符集报错
SQL> alter database character set al32utf8;
alter database character set al32utf8
*
第 行出现错误:
ORA-: 新字符集必须为旧字符集的超集
SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%'
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET ZHS16GBK
NLS_NCHAR_CHARACTERSET AL16UTF16 SQL> conn scott/tiger
SQL> create table test(id int,c_name varchar2());
表已创建。
SQL> insert into test values(,'板蓝根');
SQL> insert into test values(,'氮䓬斯汀');
SQL> commit;
SQL> insert into test values(,'氮卓斯汀');
SQL> commit; SQL> select * from test
ID C_NAME
---------- --------------------
板蓝根
氮?斯汀
氮卓斯汀 C:\Users\Thinkpad>exp scott/tiger FILE=C:\Users\Thinkpad\Desktop\temp\hr_test.dmp TABLES=test
Export: Release 11.2.0.4. - Production on 星期三 6月 ::
Copyright (c) , , Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径...
. . 正在导出表 TEST导出了 行
成功终止导出, 没有出现警告。
5.2目标环境导入
SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%';
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET AL32UTF8
NLS_NCHAR_CHARACTERSET AL16UTF16 $env|grep LANG
NLS_LANG=american_america.ZHS16GBK
LANG=en_US.UTF- enmo:/home/oracleimp scott/tiger file=/home/oracle/hr_test.dmp full=y
Import: Release 11.2.0.4. - Production on Wed Jun ::
Copyright (c) , , Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Export file created by EXPORT:V11.02.00 via conventional path
import done in ZHS16GBK character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing SCOTT's objects into SCOTT
. importing SCOTT's objects into SCOTT
. . importing table "TEST" rows imported
Import terminated successfully without warnings. SQL> select * from test;
ID C_NAME
---------- ------------------------------ ˹͡
以上Oracle进行字符转换后,中文字符直接配置为Null 修改语言格式,让Oracle无需进行字符转换
export NLS_LANG=american_america.AL32UTF8 enmo:/home/oracleimp scott/tiger file=/home/oracle/hr_test.dmp full=y
Export file created by EXPORT:V11.02.00 via conventional path
import done in AL32UTF8 character set and AL16UTF16 NCHAR character set
export client uses ZHS16GBK character set (possible charset conversion)
. importing SCOTT's objects into SCOTT
. importing SCOTT's objects into SCOTT
. . importing table "TEST" rows imported
Import terminated successfully without warnings.
enmo:/home/oraclesqlplus / as sysdba
SQL*Plus: Release 11.2.0.4. Production on Wed Jun ::
Copyright (c) , , Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4. - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
数据验证
SQL> conn scott/tiger
Connected.
SQL> select * from test;
ID C_NAME
------------------------------------
板蓝根
氮?斯汀
氮卓斯汀
本次数据是有了, UTF8字符集
SQL> select dump('氮卓斯汀') from dual;
DUMP('氮卓斯汀')
--------------------------------------------------------------
Typ= Len=: ,,,,,,,,,,, GBK字符集
SQL> select dump('氮卓斯汀') from dual;
DUMP('氮卓斯汀')
---------------------------------------------
Typ= Len=: ,,,,,,, SQL> desc scott.test
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER()
C_NAME VARCHAR2() 对于两套环境test表字段进行收缩,可以发现UTF8字符集表,实际存储是使用三个字节存储一个汉字
UTF8
SQL> alter table scott.test modify c_name varchar2();
alter table scott.test modify c_name varchar2()
*
ERROR at line :
ORA-: cannot decrease column length because some value is too big
SQL> alter table scott.test modify c_name varchar2();
Table altered. GBK
GBK存储中文两个字节存储一个汉字
SQL> alter table scott.test modify c_name varchar2();
表已更改。
使用UTF8字符集存储中文生僻字的更多相关文章
- MySQL对JSON类型UTF-8编码导致中文乱码探讨
前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中 ...
- Android上显示生僻字的方法
安卓5.0+是可以显示所有(8万多个)Unicode汉字的,本文介绍显示生僻汉字的方法,这个方法也适用于其它特殊字符. Unicode值在0xFFFF以下的(2万多个简体.繁体)汉字早已被广泛支持,所 ...
- MySQL生僻字(不常用字)的完整解决方案
查看 MySQL 数据库服务器和数据库字符集 show variables like '%char%'; 查看 MySQL 数据表(table) 的字符集 show table status from ...
- Duang的成长——使用造字程序输入生僻字
使用造字程序输入生僻字 最近,一个字突然间火了起来,那就是——duang! (图片来自网络) 那么,问题来了!造字程序哪家强?(此处有掌声) 其实,微软早就考虑到各国文字的博大精深,在系统中集成了一个 ...
- python利用utf-8编码判断中文英文字符(转)
下面这个小工具包含了判断unicode是否是汉字.数字.英文或者其他字符,全角符号转半角符号,unicode字符串归一化等工作. #!/usr/bin/env python # -*- coding: ...
- php 汉字转拼音 [包含20902个基本汉字+5059生僻字]
原文:php 汉字转拼音 [包含20902个基本汉字+5059生僻字] 昨天在转换拼音的时候发现个bug,有好多字都无法转换,不过也不能怪他,毕竟人家的库才8k,应该只有常用的.无奈上网找了下,发现一 ...
- python(40):利用utf-8编码判断中文英文字符
#!/usr/bin/env Python # -*- coding:GBK -*- """汉字处理的工具: 判断unicode是否是汉字,数字,英文,或者其他字符. 全 ...
- python利用utf-8编码判断中文字符
下面这个小工具包含了 判断unicode是否是汉字,数字,英文,或者其他字符. 全角符号转半角符号. unicode字符串归一化等工作. 还有一个能处理多音字的汉字转拼音的程序,还在整理中. #!/u ...
- 解决Mysql存储中文的问题
Mysql无法存储中文或者中文乱码,当然是编码的问题.你可以mysql -u root -p进入Mysql命令行环境,然后输入命令查看当前编码格式: mysql> show variables ...
随机推荐
- springMVC_配置文件搭建基础环境
SpringMVC与Struts的区别. 一.基础jar包 二.①DispatcherServlet,handelMapping,webAction(colltroller),ModelAndView ...
- try 和 catch 的用法
try块是什么? 一个try块就是程序尝试去执行一段代码,try块后面会有几个异常处理块,如果try块中发生了异常,程序执行流就会进入相应的异常处理块中. 以下程序会帮助理解这个概念 #include ...
- C# 客户端网络请求 对HttpClient的封装
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/a1037949156/article/d ...
- WebSocketSharp中WebSocket类
websocket-sharp.clone, Version=1.0.2.39869 WebSocket由方法调用事件改为实例化委托调用,两种构造 1.构造函数 第一种 // // 摘要: // In ...
- Flutter移动电商实战 --(46)详细页_自定义TabBar Widget
主要实现详情和评论的tab provide定义变量 自己做一个tab然后用provide去控制 定义两个变量来判断是左侧选中了还是右侧选中了.并定义一个方法来接受参数,修改是左侧还是右侧选中的状态值 ...
- Flutter移动电商实战 --(40)路由_Fluro的全局注入和使用方法
路由注册到顶层,使每个页面都可以使用,注册到顶层就需要在main.dart中 main.dart注册路由 注入 onGenerateRoute是MaterialApp自带的路由配置项, 首页跳转到详细 ...
- Linux C Socket编程:文件上传
一个服务端等待, 客户端上传文件到服务端,通过输入要上传的文件名,目前只做到仅对当前执行文件的目录下的文件,应该在服务端收到文件路径之后进行处理的. 服务端代码: #include <netin ...
- Visual studio 正在从以下位置加载符号:Microsoft符号服务器 尝试取消禁用后续符号加载
正在从以下位置加载符号:Microsoft符号服务器 尝试取消禁用后续符号加载 进入VS---工具---选项----调试----符号,看右边有个“Microsoft符号服务器”,将前面的勾去掉,( ...
- SringCloud学习成长之路 八 消息总线
Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务 ...
- python基础之线程、进程、协程
线程 线程基础知识 一个应用程序,可以多进程.也可以多线程. 一个python脚本,默认是单进程,单线程的. I/O操作(音频.视频.显卡操作),不占用CPU,所以: 对于I/O密集型操作,不会占用C ...