mysql5.1中utf8编码下一个汉字占用一个char的疑惑

最近发现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个。

推想:varchar字节最大65535,utf8编码一个字符3个字节65535/3=21785。但是用length函数取值的时候发现,一个汉字占3个字节,一个字母等字符占用一个字节。这个对于char(10)来说,是不是实际长度是不定的呢?

参考链接:

http://www.oschina.net/question/59889_12699

http://zhidao.baidu.com/question/132054814

时间: 2024-11-11 03:23:38

mysql5.1中utf8编码下一个汉字占用一个char的疑惑的相关文章

UTF-8编码下'\u7528\u6237'转换为中文汉字'用户'

UTF-8编码下'\u7528\u6237'转换为中文'用户' 一.前言 有过多次,在开发项目中遇见设置文件编码格式为UTF-8,但是打开该文件出现类似\u7528这样的数据,看也看不懂,也不是平常见到的乱码.这里的\u7528类似的数据,其中'\u'表示UNICODE编码,其实数据就是对应的UTF-8下的汉字. 二.问题处理 下面文件的编码已被设置为UTF-8,但打开这里的原文件部分内容如下: #use 1,2 #admin_login 100001=\u7528\u6237\u540D\u6

关于 MySQL UTF8 编码下生僻字符插入失败/假死问题的分析

1.问题:mysql 遇到某些中文插入异常 最近有同学反馈了这样一个问题: 上述语句在脚本中 load 入库的时候会 hang 住,web 前端.命令行操作则要么抛出 Incorrect string value: '\xF0\xA1\x8B\xBE\xE5\xA2...' for column 'name', 要么存入MYSQL数据库的内容会被截断或者乱码,而换做其它的中文则一切正常. 嗯,看起来有点奇怪哈,按理说 utf8 编码是覆盖了所有中文的,不应该出现上述问题. 2.原因:此 utf8

cmd中utf-8编码的问题

有时候我们需要使用cmd显示某个utf-8编码的文本,这时候就需要设置cmd的代码页为65100. 也就是 chcp 65001 这条命令.这样设置可以临时生效. 如何要永久生效,需要在注册表中修改. HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe 设置此路径名为 CodePage 项(DWORD32位值) ,值为十进制 65100. 以下是一些字符集:我们常用的是默认的 936 简体中文 和 65100 的 utf-8 . 125

php正则匹配utf-8编码的中文汉字

在javascript中,要判断字符串是中文是很简单的.比如: var str = "php编程"; if (/^[\u4e00-\u9fa5]+$/.test(str)) { alert("该字符串全部是中文"); } else { alert("该字符串不全部是中文"); } PHP中,判断中文的正则表达式如下: if(!preg_match("/^[\x{4e00}-\x{9fa5}A-Za-z0-9_]+$/u",$s

mysql中utf8编码的utf8_bin,utf8_general_cs,utf8_bin的区别

utf8_general_ci 不区分大小写,这个你在注册用户名和邮箱的时候就要使用. utf8_general_cs 区分大小写,如果用户名和邮箱用这个 就会照成不良后果 utf8_bin: compare strings by the binary value of each character in the string 将字符串每个字符串用二进制数据编译存储. 区分大小写,而且可以存二进制的内容 举例说明: 如果你的Sql查询语句: where first_name="Bob"

python中一个汉字点3个字节? utf-8

今天发现了一个汉字占了3个字节,一开始以为是两个呢,字符串切片时总出现乱码,后来才发现一个中文占3个字节.这才解决了乱码问题 原来  1. utf-8 编码中,一个汉字占三个字节.英文字母是一个占用一个字节. 参考链接:https://blog.csdn.net/cadi2011/article/details/82048702 我发现python里面,汉子的长度,一个是占3个 1.难道是因为 utf-8的话一个汉子是占用了3个字节 2.反正今天顺着一个bug,想看看字符串的长度,结果一串英文,

Python中的Unicode编码和UTF-8编码

下午看廖雪峰的Python2.7教程,看到 字符串和编码 一节,有一点感受,结合崔庆才的Python博客 ,把这种感受记录下来: ASCII码:是用一个字节(8bit, 0-255)中的127个字母表示大小写字母,数字和一些符号.主要用来表示现代英语和西欧语言. 所以处理中文就出现问题了,因为中文处理至少需要两个字节,所以中国制定了GB2312. 所以,各国制定了各国的标准.日本制定了Shift_JIS,韩国制定了Euc-kr...那么,乱码就来了. 为了统一,Unicode诞生了.统一码把所有

utf-8中的汉字占用多少字节

转载:http://blog.csdn.net/chummyhe89/article/details/7777613 占2个字节的:〇 占3个字节的:基本等同于GBK,含21000多个汉字 占4个字节的:中日韩超大字符集里面的汉字,有5万多个 一个utf8数字占1个字节 一个utf8英文字母占1个字节 在查找 UTF-8 编码资料时发现,很多的帖子说的 UTF-8 编码里,一个汉字占用3个字节,有的还做了个证明,大概是这样的,创建一个没有BOM的UTF-8编码的文本文件,里面保存了几个汉字,然后

在UTF8(linux)下,逆置汉字字符串

#include <stdio.h> int main() { char c[]="我是如此热爱编程!"; int index=0,min=0,max; while(c[index]) { index ++; } max = index -1; while(max > min) { char tmp = c[min]; c[min]=c[max-2]; c[max-2]=tmp; tmp = c[min+1]; c[min+1]=c[max-1]; c[max-1]=