NinJa911 Blog - 用户
type: channel
link: https://blog.ninja911.com/tag/%E7%94%A8%E6%88%B7/
items: 深度挖掘Ucenter用户表长度规则

深度挖掘Ucenter用户表长度规则
type: item
date: 2013-05-25T23:45:00+08:00
description: 因为公司项目需要整合Discuz Ucenter用户中心，并依托Ucenter为基础，方便以后其他应用中的用户一致性。在最近几天开发用户这块地方的时候，一不小心就深入到Ucenter里了，今天并分享挖掘出来的结论，也许对你们有帮助。主要解决各个应用之间对用户名在不同编码、语言开发中的长度Length限制做了一次深入的挖掘。首先我们复习一下“字符”这个玩意儿。在Javascript中，不管utf-8还是gbk，一个汉字总是等于2个字符的，不过全角的情况比较特殊，有些是1.5个字符。在PHP中，utf-8编码情况下，一个汉字是等于3个字符；而gbk编码下，一个汉字是等于2个字符。Ucenter的members表中的username字段是设计为VARCHAR(60)，其实是有原因的。我慢慢道来。要成为Ucenter一个会员，其中一个规则就是用户名必须在 3 ~ 15 之间，我没有说单位，是马上要解释。 3 ~ 15可以是3至15个字符，也可以理解为3-15个汉字，Ucenter不管你汉字还是字母数字，反正按个数，必须在3~15之间（包括3和15），那么我们来换算一下PHP后，在utf-8编码情况下，15个汉字是45个字符；gbk编码下是30个字符，这下你就会明白为什么用户表member字段要设置为VARCHAR(60)了吧，当然可能60长度有点多余的，那是因为VARCHAR属性决定了可以扩展的，至少你不能设计为长度小于30吧。根据Ucenter的设计规则，那么我们前台判断用户名长度的时候，利用Javascript就要去做4-30个字符限制判断。附上utf-8下的php判断代码一则 if (Check::userName($username, 2, 15, 'CHINESE2')) { $arr_return['error'] = -10; $arr_return['message'] = '用户名限汉字、数字、字母或下划线，且不能以数字和下划线开头'; $this->jsonp_echo($arr_return); }