Maison > Questions et réponses > le corps du texte
mysql 中的varchar(255) uft-8 的格式到底能放多少汉字?
怪我咯2017-04-17 11:13:21
在字符集为UTF-8的情况下:
ver < 4.1
: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8 3字节编码长度),则VARCHAR(255)共可存放约85个汉字;ver >= 4.1
: VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。另外,据我所知,MySQL对UTF-8的支持也仅仅限于1~3字节编码长度(Unicode:0x0000~0xFFFF),可以满足大部分需求,但是生僻字就不行了。
高洛峰2017-04-17 11:13:21
好吧这问题的最佳答案难选了 ... 我是来添乱的 ...
楼上三个回复都正确但都不全面 ...这事情主要还是看 数据库字符集 ...
如果是 latin1 的话 ... 计算字节长度 ... greatghoul 的答案是对的 ...
如果是 utf-8 的话 ... 计算字符长度 ... joyeu 的答案是对的 ...
至于 Theo 的答案里说的 4.1 为临界点的区别 ... 这事情真心和版本没什么关系 ...
只是因为 4.1 之后才引入字符集支持的口牙!
如果选 latin1 的话不管什么版本都会计算字节长度的口牙!
为了避免这个答案看起来是完全照抄了楼上 ... 我提一点其他的东西 ...
其实这题目里有另外一个坑 ... 就是要保存的东西是 汉字 ...
如果要保存 utf-8 字符的话 latin1 字符集可以保存 63 - 127 个 ...
但如果要保存汉字 ... 那么最大数量恐怕只有精确的 85 个 ...
因为我在码这些字之前自己想尽了一切方法测试都没能找到一个占用四字节的汉字 ...
怾gi
黁nun
兺bun
乯olo
乭daori
旕eosi
銰ngai
虄sari
哛popuni
硛ceoke
縇seone
穒keweoke
这组字够不够生僻 ..? 每个字也仅仅占用三字节而已 ...
至于两字节的汉字 ... 我也找不到 ... greatghoul 说的 〇
是错的 ... 〇
占用三字节 ...
来个总结性陈词 ...
MySQL 中的 VARCHAR(255) 可以存放 1 - 255 个 UTF-8 格式的汉字 ...
latin1 字符集最多可以存放 85 个 UTF-8 格式的汉字 ...
utf-8 字符集最多可以存放 255 个 UTF-8 格式的汉字 ...
如果谁可以找到一个占用两字节或者占用四字节的汉字那么我的这个答案就错了 ...
找不到的话可以姑且信之 ...
以上 ...
大家讲道理2017-04-17 11:13:21
这个要看佻存的什么字了,utf-8 是变长了,有的汉字占3个,有得占四个。
可以参考这篇文章:
http://blog.csdn.net/chummyhe89/artic...
占2个字节的:〇
占3个字节的:基本等同于GBK,含21000多个汉字
占4个字节的:中日韩超大字符集里面的汉字,有5万多个
一个utf8数字占1个字节
一个utf8英文字母占1个字节
迷茫2017-04-17 11:13:21
MySQL5下应该是255个。对于latin1的字符集的情况,中文存进去就是乱码了,select出来显示为英文问号?
MySQL5下Varchar(2)的实测情况如下:
CREATE TABLE `test`.`tb1`( `p1` VARCHAR(2) ) CHECKSUM=1 COMMENT='' DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=utf8 ;
INSERT INTO `test`.`tb1`(`p1`) VALUES ( '你好');
INSERT INTO `test`.`tb1`(`p1`) VALUES ( '你很坏');
INSERT INTO `test`.`tb1`(`p1`) VALUES ( '1234');
SELECT * FROM `test`.`tb1` LIMIT 0, 50;
得到:
你好
你很
12
CREATE TABLE `test`.`tb2`( `p1` VARCHAR(2) ) CHECKSUM=1 COMMENT='' DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC CHARSET=latin1 ;
INSERT INTO `test`.`tb2`(`p1`) VALUES ( '1234');
INSERT INTO `test`.`tb2`(`p1`) VALUES ( '你好');
INSERT INTO `test`.`tb2`(`p1`) VALUES ( '你12');
SELECT * FROM `test`.`tb2` LIMIT 0, 50;
得到:
12
??
?1
伊谢尔伦2017-04-17 11:13:21
感觉上面两个答案都是不对的,MySQL中的char或者varchar括号中的数字指的是最大字符个数,不是字节数。所有255就是说最多允许255个汉字,如果有字母存在,字母和汉字的总数还是不能超过255个。