html的表单length长度是以字符个数计算的,不管是汉字还是字母,但是数据库又是按字节计算的,汉字占2个字母占1个,这样容易造成写入的时候长度超出的问题。
两个问题:
1.有没有好的方法,能够在前端或者php或者mysql之间使用统一的方法计算长度?
2.还是只能把数据库长度设的足够大,让表单永远不会超出?
.
html的表单length长度是以字符个数计算的,不管是汉字还是字母,但是数据库又是按字节计算的,汉字占2个字母占1个,这样容易造成写入的时候长度超出的问题。
两个问题:
1.有没有好的方法,能够在前端或者php或者mysql之间使用统一的方法计算长度?
2.还是只能把数据库长度设的足够大,让表单永远不会超出?
.
统一计算长度,是基于“长度”这个概念是一样的标准的,首先你要规定你的“长度”指的是什么。
如果“长度”指的字节长度,那么可以这样(假设页面编码是utf8):
// javascript
function lengthInUtf8Bytes(str) {
// Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence.
var m = encodeURIComponent(str).match(/%[89ABab]/g);
return str.length + (m ? m.length : 0);
}
len = lengthInUtf8Bytes(str);
//php
$len = strlen($str);
//mysql
CREATE DATABASE `byte_test`
CHARACTER SET latin1
COLLATE latin1_general_ci;
javascript函数lengthInUtf8Bytes来自于String length in bytes in JavaScript
如果“长度”指的编码长度,还是假设页面utf8编码:
// javascript
len = str.length;
// php
$len = mb_strlen($str,"UTF-8");
// mysql
CREATE DATABASE `utf8_test`
CHARACTER SET utf8
COLLATE utf8_general_ci;
这样长度都是一致的,所以要在最开始就定义好你的“长度”指的是什么很重要
如果你统一都使用UTF-8编码,就没有这个苦恼了。数据库表用UTF-8,一个汉字或字母都是一,也就是说varchar(2)类型,你肯定可以把 "测试” 这两个字存入。对应mysql实际存储会使用6个字节,通常情况下一个汉字需要用3个字节来存储,但这是mysql底层做的事,跟你定义的varchar里面的长度没有关系。
如果不怕麻烦的话,
你可以自己设计一个通用拦截器进行提交前检查,
首先获取数据库的元数据信息, 比如编码和字段长度(这个可以使用缓存的信息一般不会变化).
然后根据这个算出相应的字段最长能容纳几个汉字,几个英文字符.
之后在前端或者php计算出相应的字节数, 这样就不会有问题了.
不过性能会因此稍有损失.
更好的办法就是对不定长度的数据把字段使用变长类型比如varchar设计的足够大.
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
5 回答3.2k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
mysql在4.1之后,char和varchar定义的就是字符长度了。
具体可以去看下文档The CHAR and VARCHAR Types。
而4.1的文档中有直接提到。