Oracle中一个汉字占几个字节
Oracle中一个汉字占几个字节?
某天,在向一个字段类型为CHAR(6)的表中插入数据’大沽口’时报错,提示’too large for column(actual: 9 ,maximum: 6)’。
我这眉头一皱,发现了事情没有这么简单。怎么办?百度!下面直接放结论:
- N开头的字段类型(比如NCHAR,NVARCHAR2)中,任何一个字符(包括一个汉字)占2个字节,统一的。
- 不以N开头的字段类型(比如CHAR,VARCHAR2)中,部分unicode字符(比如汉字)占3个字节,其它字符占1个字节
实践一下
Length 函数求得是占用字符数,lengthb或者vsize函数求得是占用字节数。
select length(‘测试1’) from dual --返回3,占用3个字符
select lengthb(‘测试1’) from dual --返回7,占用7个字节,其中汉字占3个字节,数字占一个字节
select length(N’测试1’) from dual --返回3,占用3个字符
select lengthb(N’测试1’) from dual --返回6,这是将字符串转换成为Unicode字符串后,每个字符占用2个字节
测试完之后,我不禁陷入了沉思:数据库字符集是UTF-8,一个中文占三个字节,当把中文转换为Unicode字符之后却只占2个字符。这是为啥呢?接着收集资料。
为何Unicode中文字符占取2个字节,而 UTF-8却占3个字节?
发明 UTF-8的初衷是为了修正Unicode中任何字符至少占用2个字节的弊端。虽然UTF-8英文字符占空间减少了(由Unicode中的16位动态缩减为与ASCⅡ一致的8位),但在中文字符这部分增为3字节=24位,减少的空间一下子又没了。
Unicode符号范围 | UTF-8编码方式 | 说明 |
---|---|---|
(十六进制) | (二进制) | #Unicode部分为16进制编码, UTF-8编码为2进制 |
0000 0000-0000 007F | 0xxxxxxx | #UTF-8规定,若1字符=1字节,首位须为‘0’ |
0000 0080-0000 07FF | 110xxxxx 10xxxxxx | #UTF-8规定,若1字符=2字节,高位字节前3位为‘110’,低位前2位为‘10’ |
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx | #UTF-8规定,若1字符=3字节,高位字节前3位为‘110’,后面低位前2位一律为‘10’。(占4,5字节字符规则以此类推) |
由于UTF-8规则天然占用字节前几位,若与Unicode同样用2字节16位表示一个中文字符,则utf-8除去规则占用,只剩余16-5=11位,无法存储中文,只能再增加一个字节,1字符=3字节,除去规则占用,还剩余8x3-8=16位,恰好符合16位=1中文字符这一Unicode规则
举个例子:
已知“严”的Unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此“严”的UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从“严”的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,“严”的UTF-8编码是“11100100 10111000 10100101”,这是保存在计算机中的实际数据,转换成十六进制就是E4B8A5
[参考地址][https://www.zhihu.com/question/23374078/answer/134244691]
补充
UTF-8英文1字节中文3字节,在编码效率和编码安全性之间做了平衡,适合网络传输,是理想的中文编码方式。UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度
GBK英文1字节(半角1字节,全角2字节),中文2字节,GBK的范围比GB2312广,GBK兼容GB2312。
Unicode编码则是采用双字节16位来进行编号,可编65536字符
Oracle中一个汉字占几个字节相关推荐
- oracle和mysql存储汉字_mysql和oracle的一个汉字占几个字节
以前一直使用oracle11g,一个汉字占3个字节,所以在操作mysql时也一直这样分配长度. 今天测试了下发现不对了 可以看到第一个的长度确实是15,但是第二个为什么是5? 在网上找到资料:char ...
- utf-8 中的一个汉字占几个字节
utf-8 中的一个汉字占几个字节 占 2 个字节的:〇 占 3 个字节的:基本等同于 GBK,含 21000 多个汉字 占 4 个字节的:中日韩超大字符集里面的汉字,有 5 万多个 1 个 utf8 ...
- mysql汉字占几个字符_mysql和oracle的一个汉字占几个字符
以前一直使用oracle11g,一个汉字占3个字节,所以在操作mysql时也一直这样分配长度. 今天测试了下发现不对了 可以看到第一个的长度确实是15,但是第二个为什么是5? 在网上找到资料:char ...
- python中一个汉字点3个字节? utf-8
今天发现了一个汉字占了3个字节,一开始以为是两个呢,字符串切片时总出现乱码,后来才发现一个中文占3个字节.这才解决了乱码问题 原来 1. utf-8 编码中,一个汉字占三个字节.英文字母是一个占用一 ...
- mysql 中 一个汉字吗_MySQL 中一个汉字占多少存储?
MySQL 中一个汉字占多少存储? 1. 一个汉字占多少长度与编码有关: UTF8: 一个汉字 = 3 个字节 GBK: 一个汉字 = 2 个字节 2.varchar(n)能存储几个汉字? varch ...
- utf-8中一个汉字是3个字节,你知道吗?
问题导入: 今天学习了mysql中的函数,length(字符串),计算字符串长度函数,返回字符串的字节长度. select length('abc'); 查询的结果是3. select length( ...
- 一个汉字占几个字节的问题
一个汉字占几个字节的问题 大家都说一个汉字占两个字节(byte) 但是为什么运行程序会得到如下结果 String name="宋"; int a=name.getBytes(&qu ...
- java 汉字 字节_java中的汉字占几个字节
java中的汉字占几个字节 发布时间:2020-06-25 20:02:07 来源:亿速云 阅读:217 作者:Leah 今天就跟大家聊聊有关java中的汉字占几个字节,可能很多人都不太了解,为了让大 ...
- java一个中文几个字节_java一个汉字占几个字节;一个字符占几个字节?redis一个汉字占几个字节;一个字符占几个字节?...
脱离字符集编码 谈这个问题没什么实际意义 我不知道你讲的Java 中汉字是几个字节具体是什么意思 Java 中 Character 采用的是 utf-16 编码,那么就是两个字节(0----65535 ...
最新文章
- 空间谱专题09:阵列信号建模方法
- 依赖注入框架Autofac学习笔记
- 以智能数据架构,挖掘增长金矿 1
- 2020 8月 每日花语
- 【数据结构与算法】之深入解析“分发糖果”的求解思路与算法示例
- Basler相机SDK相关问题收集与知识汇总
- javafx树视图加选框_JavaFX缺少的功能调查:表视图
- FastJson稍微使用不当就会导致StackOverflow
- 判断字段是否与枚举相同_Scala基础学习九之枚举和Trait了解
- 动手学深度学习(PyTorch实现)(九)--VGGNet模型
- Leetcode每日一题:197.rising-temperature(上升的温度)
- 判断 Map 中是否包含指定的 key 和 value
- BXP 3.11样机安装详细说明(转)
- wk一sm5时间温度控制器_吓人!用“御寒神器”取暖,竟上了手术台……注意!温度不高也会烫伤...
- Centos7做回收站功能,防止误删除
- 过 DNF TP 驱动保护(二)
- H盘显示数据错误循环冗余检查要怎样办啊
- 【源码阅读 | 04】update-notifier 检查包更新
- 浏览器原理-持续汇总
- 13.56Mhz下50欧姆阻抗匹配简易教程
热门文章
- PTA:7-9 分钟秒钟的时间相减
- java版我的世界MITE怎么下_我的世界mite作弊图文教程
- JavaScript断言
- 看两种截然不同的设计理念:分布式文件系统支持大和小文件的思考
- SOA 架构中的ESB是更好的应用于异构系统集成整合还是用于统一服务调用/基础服务实施...
- 【我们为什么用高斯机制?】差分隐私代码实现系列(七)
- Qml SwipeView禁用滑动动画
- 噪音恐惧症_比恐惧强:公开的心理健康
- linux7操作,Linux centos7 基本操作 七
- 2022年舞台造雪机市场前景分析及研究报告