mysql5.1中utf8编码下一个汉字占用一个char的疑惑
来源:互联网 发布:js兄弟节点 编辑:程序博客网 时间:2024/06/05 11:43
最近发现Oracle和MySQL的字段长度的计算不一样(都是UTF8编码),比如:
在Oracle下定义:name varchar2(10) ,name字段能存放:10个字符或3个汉字
在MySQL下定义:name varchar(10),name字段能存放:10个字符或10个汉字
从上面可以得知:在oracle下,1个汉字=3个字节
为什么在 MySQL 下,1个汉字=1个字节 呢??
经查,说:MySQL5 以后 varchar 的单位是字符了,而 oracle 的varchar2 是字节
编码不一样一个汉字占用的字节也不一样:
UTF-8 下 1汉字=3字节
GDK下 1汉字=2字节
mysql varchar(50),不管中文还是英文都是存50个的。
MySQL5的文档,其中对varchar字段类型这样描述:varchar(m) 变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,最大有效长度是65,532字节)。
为何会这般变换?真是感觉MySQL的手册做的太不友好了,因为你要仔细的继续往下读才会发现这段描述:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。
好了,貌似懂了一点。但具体他说的长度大于255时使用2个字节长度前缀,小学减法题:65535 - 2 = 65533啊。不知道这些大牛如何计算的,暂且保留疑问吧?
注:我测试了一下使用UTF8编码,varchar的最大长度为21854字节。
在mysql 5.0.45版本,数据库编码utf8下进行测试:varchar最长定义为21785。也就是说不论字母、数字、汉字,只能放21785个。
在Oracle下定义:name varchar2(10) ,name字段能存放:10个字符或3个汉字
在MySQL下定义:name varchar(10),name字段能存放:10个字符或10个汉字
从上面可以得知:在oracle下,1个汉字=3个字节
为什么在 MySQL 下,1个汉字=1个字节 呢??
经查,说:MySQL5 以后 varchar 的单位是字符了,而 oracle 的varchar2 是字节
编码不一样一个汉字占用的字节也不一样:
UTF-8 下 1汉字=3字节
GDK下 1汉字=2字节
mysql varchar(50),不管中文还是英文都是存50个的。
MySQL5的文档,其中对varchar字段类型这样描述:varchar(m) 变长字符串。M 表示最大列长度。M的范围是0到65,535。(VARCHAR的最大实际长度由最长的行的大小和使用的字符集确定,最大有效长度是65,532字节)。
为何会这般变换?真是感觉MySQL的手册做的太不友好了,因为你要仔细的继续往下读才会发现这段描述:MySQL 5.1遵从标准SQL规范,并且不删除VARCHAR值的尾部空格。VARCHAR保存时用一个字节或两个字节长的前缀+数据。如果VARCHAR列声明的长度大于255,长度前缀是两个字节。
好了,貌似懂了一点。但具体他说的长度大于255时使用2个字节长度前缀,小学减法题:65535 - 2 = 65533啊。不知道这些大牛如何计算的,暂且保留疑问吧?
注:我测试了一下使用UTF8编码,varchar的最大长度为21854字节。
在mysql 5.0.45版本,数据库编码utf8下进行测试:varchar最长定义为21785。也就是说不论字母、数字、汉字,只能放21785个。
推想:varchar字节最大65535,utf8编码一个字符3个字节65535/3=21785。但是用length函数取值的时候发现,一个汉字占3个字节,一个字母等字符占用一个字节。这个对于char(10)来说,是不是实际长度是不定的呢?
参考链接:
http://www.oschina.net/question/59889_12699
http://zhidao.baidu.com/question/132054814
0 0
- mysql5.1中utf8编码下一个汉字占用一个char的疑惑
- 汉字UTF8编码占用几个字节
- 判断一个char*是不是utf8编码
- NSURL汉字UTF8编码
- MySQL5.6 varchar在UTF8下存储汉字的长度
- UTF8默认编码下的MYSQL命令框中输入汉字显示乱码的问题
- Elixir中将GB2312编码的汉字转为UTF8编码
- Ubuntu中MySQL5.7设置utf8编码格式步骤
- Ubuntu中MySQL5.7设置utf8编码格式步骤
- FTP采用UTF8编码上传文件名中含有奇数个汉字时出错的解决方法
- 在utf8和gb2312中 不同编码情况下,汉字 数字 英文占的字节数?
- vs中cpp文件编码格式为utf8,注释有汉字,编译不通过的问题
- java中char与汉字占用字节个数问题
- Oracle中一个汉字占用字节长度
- mysql 中utf8编码存放中文汉字问题
- Linux下MySQL5.6的修改字符集编码为UTF8
- Linux下MySQL5.6的修改字符集编码为UTF8
- 疑惑的汉字
- 什么是C#编程语言明明白白学C#
- RFC中关于IPv6 DNS的介绍
- cocos2d-x 3.2 之 三消类游戏——万圣大作战 (第三篇)
- leetcode30 Substring with Concatenation of All Word
- Android应用截图和SurfaceView截图问题(学生PAD抽奖系统)
- mysql5.1中utf8编码下一个汉字占用一个char的疑惑
- C#获取 URL参数
- 10大算法之kmeans算法学习
- STM32重映射简介
- ubuntu 13.10之后的系统启动出现Grub rescue的修复方法
- C语言——设计printf调试宏
- RTSP协议详解
- MAC下安装wget
- ATL服务器:用 Visual C++创建的高性能的Web应用程序和XML Web 服务