表单字符长度与数据库字段长度
html的表单length长度是以字符个数计算的,不管是汉字还是字母,但是数据库又是按字节计算的,汉字占2个字母占1个,这样容易造成写入的时候长度超出的问题。
两个问题:
1.有没有好的方法,能够在前端或者php或者mysql之间使用统一的方法计算长度?
2.还是只能把数据库长度设的足够大,让表单永远不会超出?
.
有魔法的男人
9 years, 8 months ago
Answers
统一计算长度,是基于“长度”这个概念是一样的标准的,首先你要规定你的“长度”指的是什么。
如果“长度”指的字节长度,那么可以这样(假设页面编码是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;
这样长度都是一致的,所以要在最开始就定义好你的“长度”指的是什么很重要
神经病没有好转
answered 9 years, 8 months ago
mysql在4.1之后,char和varchar定义的就是字符长度了。
具体可以去看下文档
The CHAR and VARCHAR Types
。
而4.1的文档中有直接提到。
The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters. (Before MySQL 4.1, the length is interpreted as number of bytes.)
lplql
answered 9 years, 8 months ago