为了账号安全,请及时绑定邮箱和手机立即绑定

用js如何正确判断输入的内容存储在mysql的长度是多少?

用js如何正确判断输入的内容存储在mysql的长度是多少?

神不在的星期二 2019-08-21 18:04:40
假如我输入年薪30K以上这个用length属性判断后长度是7我的数据库编码是utf8mb4,一个汉字的长度相当于4但是如果这个字段存入数据库后相当于19加入我输入了【年薪30K以上】这个内容,我应该如何用js才能计算出他的长度是19
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

utf8是变长编码的字符存储方式,utf8mb4只是每个字符最大长度占4字节,而非任一字符都占4字节。
原本MySQL的utf8只能储存基本多语言平面(BMP)上的字符。utf8mb4编码之下,BMP上的字符和utf8编码完全相同,常用汉字仍然只占3个字节,真正占用四个字节的字符常见的只有姓名生辟字和表情符号。
在MySQL数据库中varchar字段的长度是按字符来描述的,而不是字节,所以“年薪30K以上”用varchar(7)的字段就可以存得下。
你可以自己试试:
CREATETEMPORARYTABLE`test`(txtVARCHAR(7)NOTNULL)CHARSET='utf8mb4';
INSERTINTO`test`VALUES('年薪30K以上');
然而下面这个却保存不下:
INSERTINTO`test`VALUES('12345678');
ERROR1406(22001):Datatoolongforcolumn'txt'atrow1
至于计算文本的utf8mb4编码字符串的字节长度,可以按字符编码范围来判断,根据RFC-3629的规范:
从U+0000到U+007F占一个字节
从U+0080到U+07FF占两个字节
从U+0800到U+FFFF占三个字节
从U+10000到U+10FFFF占四个字节
functionbyteLength(str){
letlen=0;
console.log("单字节字符");
str.replace(/[\u{00}-\u{7f}]/gu,e=>{
len+=1;
console.log(e);
});
console.log("双字节字符");
str.replace(/[\u{80}-\u{07ff}]/gu,e=>{
len+=2;
console.log(e);
});
console.log("三字节字符");
str.replace(/[\u{0800}-\u{ffff}]/gu,e=>{
len+=3;
console.log(e);
});
console.log("四字节字符");
str.replace(/[\u{010000}-\u{10ffff}]/gu,e=>{
len+=4;
console.log(e);
});
returnlen;
}
console.log("总字节数",byteLength("English中文??Español?"));
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 473 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信