表单字符长度与数据库字段长度


html的表单length长度是以字符个数计算的,不管是汉字还是字母,但是数据库又是按字节计算的,汉字占2个字母占1个,这样容易造成写入的时候长度超出的问题。

两个问题:
1.有没有好的方法,能够在前端或者php或者mysql之间使用统一的方法计算长度?
2.还是只能把数据库长度设的足够大,让表单永远不会超出?

.

HTML php mysql JavaScript

有魔法的男人 9 years, 2 months ago

如果不怕麻烦的话,
你可以自己设计一个通用拦截器进行提交前检查,
首先获取数据库的元数据信息, 比如编码和字段长度(这个可以使用缓存的信息一般不会变化).
然后根据这个算出相应的字段最长能容纳几个汉字,几个英文字符.
之后在前端或者php计算出相应的字节数, 这样就不会有问题了.
不过性能会因此稍有损失.
更好的办法就是对不定长度的数据把字段使用变长类型比如varchar设计的足够大.

katia answered 9 years, 2 months ago

如果可以后台也需要对参数进行长度校验,别人是可以直接请求后台服务接口的。
前端有对于的maxlength可以控制一下输入长度。

night2 answered 9 years, 2 months ago

数据库字段不一定非要搞得那么精准,说十个字节就一定限制十个字节,限制长度是通过程序做的,数据库字段只是提供一个范围而已

AeonS answered 9 years, 2 months ago

2楼好专业,赞

losneo answered 9 years, 2 months ago

如果你统一都使用UTF-8编码,就没有这个苦恼了。数据库表用UTF-8,一个汉字或字母都是一,也就是说varchar(2)类型,你肯定可以把 "测试” 这两个字存入。对应mysql实际存储会使用6个字节,通常情况下一个汉字需要用3个字节来存储,但这是mysql底层做的事,跟你定义的varchar里面的长度没有关系。

akiba answered 9 years, 2 months ago

前台限制只是障眼法,数据库较量弄长点,不用太抠门了

-danta- answered 9 years, 2 months ago

统一计算长度,是基于“长度”这个概念是一样的标准的,首先你要规定你的“长度”指的是什么。
如果“长度”指的字节长度,那么可以这样(假设页面编码是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, 2 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, 2 months ago

Your Answer