使用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字符集进行修改,但修改后,可能会将原有数据全部变成乱码。(可以咨询一下太极DBA,是否有可行的方法)
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
*
第 1 行出现错误:
ORA-12712: 新字符集必须为旧字符集的超集
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(200));
表已创建。
SQL> insert into test values(1,‘板蓝根‘);
SQL> insert into test values(2,‘氮?斯汀‘);
SQL> commit;
SQL> insert into test values(3,‘氮卓斯汀‘);
SQL> commit;

SQL> select * from test
ID C_NAME
---------- --------------------
1 板蓝根
2 氮?斯汀
3 氮卓斯汀

C:\Users\Thinkpad>exp scott/tiger FILE=C:\Users\Thinkpad\Desktop\temp\hr_test.dmp TABLES=test
Export: Release 11.2.0.4.0 - Production on 星期三 6月 26 13:20:58 2019
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
连接到: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
已导出 ZHS16GBK 字符集和 AL16UTF16 NCHAR 字符集
即将导出指定的表通过常规路径...
. . 正在导出表 TEST导出了 3 行
成功终止导出, 没有出现警告。

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-8

enmo:/home/oracleimp scott/tiger file=/home/oracle/hr_test.dmp full=y
Import: Release 11.2.0.4.0 - Production on Wed Jun 26 01:27:22 2019
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 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" 3 rows imported
Import terminated successfully without warnings.

SQL> select * from test;
ID C_NAME
---------- ------------------------------
1
2
3 ??
以上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" 3 rows imported
Import terminated successfully without warnings.
enmo:/home/oraclesqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Wed Jun 26 02:40:32 2019
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 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
------------------------------------
1 板蓝根
2 氮?斯汀
3 氮卓斯汀
本次数据是有了,

UTF8字符集
SQL> select dump(‘氮卓斯汀‘) from dual;
DUMP(‘氮卓斯汀‘)
--------------------------------------------------------------
Typ=96 Len=12: 230,176,174,229,141,147,230,150,175,230,177,128

GBK字符集
SQL> select dump(‘氮卓斯汀‘) from dual;
DUMP(‘氮卓斯汀‘)
---------------------------------------------
Typ=96 Len=8: 181,170,215,191,203,185,205,161

SQL> desc scott.test
名称 是否为空? 类型
----------------------------------------- -------- ----------------------------
ID NUMBER(38)
C_NAME VARCHAR2(200)

对于两套环境test表字段进行收缩,可以发现UTF8字符集表,实际存储是使用三个字节存储一个汉字
UTF8
SQL> alter table scott.test modify c_name varchar2(8);
alter table scott.test modify c_name varchar2(8)
*
ERROR at line 1:
ORA-01441: cannot decrease column length because some value is too big
SQL> alter table scott.test modify c_name varchar2(12);
Table altered.

GBK
GBK存储中文两个字节存储一个汉字
SQL> alter table scott.test modify c_name varchar2(8);
表已更改。

原文地址:https://www.cnblogs.com/lvcha001/p/11089849.html

时间: 2024-10-09 09:33:50

使用UTF8字符集存储中文生僻字的相关文章

MySQL对JSON类型UTF-8编码导致中文乱码探讨

前言 继上文发表之后,结合评论意见并亲自验证最终发现是编码的问题,但是对于字符编码还是有点不解,于是乎,有了本文,我们来学习字符编码,在学习的过程中,我发现对于MySQL中JSON类型的编码导致数据中文出现乱码还有可深挖之处,接下来我们来分析一下,若有错误之处,还请批评指出. 字符编码 评论中指出任何不在基本多文本平面的Unicode字符,都无法使用MySQL的utf8字符集存储,包括Emoji 表情(Emoji 是一种特殊的Unicode 编码,常见于IOS和Android 手机上)和很多不常

Android上显示生僻字、emoji的办法

理论上安卓是可以显示所有Unicode字符的,显示所有的汉字(目前Unicode里有8万多个东亚汉字).emoji当然也没问题.Unicode值在0xFFFF以下的汉字早已被广泛支持,所以本文不把它们看作生僻字.这里共有2万多个简体.繁体汉字.本文说的生僻字是指Unicode值在0xFFFF以上的汉字,emoji也在这个范围里.这个范围也叫non-BMP.可以看这篇文章了解汉字的大致分布. 主要有三个关键点: 1.确保字符集能覆盖生僻字.也就是在文件.数据库保存字符串时使用的字符集,应该是:GB

正则验证姓名否中文(包含生僻字)

1.常见的中文 \u4e00-\u9fbb 和 \u4e00-\u9fa5 (不包含生僻字) 2.比较广泛的中文汉字.(包含了咱们需要的生僻字 和 不需要的很多字符 比如 中文句号分号逗号.书名号 等等) \u2E80-\uFE4F 3.CJK标点符号 范围:\u3000-\u303F 参考地址:http://www.unicode.org/charts/PDF/U3000.pdf 根据以上三点,我们要用第二个再排除第三个,所以判断是否包含生僻字的中文姓名的正则表达式如下所示: /^((?![\

mysql生僻字插入失败解决方案

当项目已经上线运行,原来编码统一为utf8 一时间全部表字段一个一个修改为utf8mb4 很麻烦 想达到的目的是只修改可能存在生僻字的字段: 1.修改可能存在生僻字插入的字段,例如: ALTER TABLE news CHANGE title title VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '标题'; 这里除了修改字符集之外,需要加大存储 2.设置mys

MySQL生僻字插入失败的处理方法

最近,业务方反馈有个别用户信息插入失败,报错提示类似"Incorrect string value:"\xF0\xA5 ..... "   看这个提示应该是字符集不支持某个生僻字造成的. 下面是在虚拟机里复现的场景: step1.模拟原始表结构字符集环境: use test; CREATE TABLE `t1` ( `id` int(10) NOT NULL AUTO_INCREMENT, `real_name` varchar(255) CHARACTER SET utf8

FAQ系列 | utf8表存储latin1乱码字符转换

线上有个数据表,字符集是utf8,但由于环境不统一的原因,导致实际上数据表存储的内容是latin1内码的数据.也就是说,借着utf8的壳子,实际存储着latin1字符集的数据.在这种情况下,需要注意几个字符集配置: 客户端终端工具(SecureCRT)的显示字符集设置为:utf-8, Linux终端(TERM)下,设置LANG环境变量为:en_US.UTF-8,或者zh_CN.UTF-8, 连接到MySQL后,设置client/connect字符集为:latin1 (set names lati

Duang的成长——使用造字程序输入生僻字

使用造字程序输入生僻字 最近,一个字突然间火了起来,那就是--duang! (图片来自网络) 那么,问题来了!造字程序哪家强?(此处有掌声) 其实,微软早就考虑到各国文字的博大精深,在系统中集成了一个造字程序. 使用WinKey+R打开运行,输入"eudcedit"就能找到它啦~ 第一步,需要为创建的文字找一个家,也就是它的存放位置(对应的代码). 点击相应的位置即可(如AAA0)即可. 在接下来的窗口中,就可以直接选择不同的工具进行输入了,这些功能想必一看便知. 用鼠标手写汉字,难免

php 汉字转拼音 [包含20902个基本汉字+5059生僻字]

原文:php 汉字转拼音 [包含20902个基本汉字+5059生僻字] 昨天在转换拼音的时候发现个bug,有好多字都无法转换,不过也不能怪他,毕竟人家的库才8k,应该只有常用的.无奈上网找了下,发现一篇<最全的PHP汉字转拼音函数(共25961字,包含20902个基本汉字+5059生僻字)> 看着都屌,测试后也不错,都能识别,但问题是功能不够,,无奈,自己动手压缩字库(无损压缩),扩展功能.我用的是他 pinyin.php ~ 206KB 那个UTF8字库,经过压缩扩展后就剩 106K 了.当

高通智能锁UI显示方案 — 含有简繁体,生僻字,多国外文字库;

对于锁的认知,如果你还停留在机械锁的时代,那你就OUT了,要知道,中国已经步入智能化时代,并且随着人们对锁要求的提高,智能锁的普及率也越来越高.智能锁采用先进技术,个别闪光键盘.锌合金面板:坚固耐用.耐酸腐.更有保姆功能,设置相应时间段.不同于以往"先开启再扫描的方式"的方式,仅需一个动作即可轻松完成指纹扫描. 高通字库芯片支持国标GB18030标准字库,包含27484个简繁体汉字兼容UNICODE,并内置日文.韩文.法文.西班牙文.德文和阿拉伯文等170多国语言字库,功能强大,字型专