- 项目需求:
- 定长
- 递增
- 左填充0
- 例子:
- 000001,000002,000003等等
解决方案:
备注:如果有更好的解决方案,希望访问者能多多提出意见。谢谢!
第一步: 首先考虑MYSQL的存储数据类型,当时第一感觉就是用int类型,因为有个叫zerofill的小东西,于是开始建表:
CREATE TABLE `p_file` (
`file_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`file_number` int(6) unsigned zerofill NOT NULL DEFAULT '000000',
PRIMARY KEY (`file_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
第二步: 在PHP中进行查询数据库,用的是TP5框架:
Db::table('p_file')->field('file_number')->where('file_id=1')->find();
//得出的结果为:
// array (size=1)
// 'file_number' => int 1
明显没有得到预期的效果,但是数据库中查看的数据是这样的:
其实在第二步已经观察到了一些问题,int类型,后来在网上搜集了一些资料,了解到MYSQL中的cast()和convert()函数:
MySQL 的CAST()和CONVERT()函数可用来获取一个类型的值,并产生另一个类型的值。两者具体的语法如下:
1 CAST(value as type);
2 CONVERT(value, type);
就是CAST(xxx AS 类型), CONVERT(xxx,类型)。
可以转换的类型是有限制的。这个类型可以是以下值其中的一个:
二进制,同带binary前缀的效果 : BINARY
字符型,可带参数 : CHAR()
日期 : DATE
时间: TIME
日期时间型 : DATETIME
浮点数 : DECIMAL
整数 : SIGNED
无符号整数 : UNSIGNED
第三步:使用cast函数解决上面的问题:
Db::table(static::$tableName)->field('cast(file_number as char) as file_number')->where('file_id=1')->find();
//得出的结果为:
// array (size=1)
// 'file_number' => string '000001' (length=6)
上面的介绍貌似和PHP没多大关联,重点是mysql的存储和获取。下面介绍一下php源码生成上述格式的代码:
public function makeFileNumber($count){
$count++;
//生成编号,当然还有其它方法
return str_pad($count, 6, 0, STR_PAD_LEFT);
}
/**
* Pad a string to a certain length with another string
* @link http://php.net/manual/en/function.str-pad.php
* @param string $input <p>
* The input string.
* </p>
* @param int $pad_length <p>
* If the value of pad_length is negative,
* less than, or equal to the length of the input string, no padding
* takes place.
* </p>
* @param string $pad_string [optional] <p>
* The pad_string may be truncated if the
* required number of padding characters can't be evenly divided by the
* pad_string's length.
* </p>
* @param int $pad_type [optional] <p>
* Optional argument pad_type can be
* STR_PAD_RIGHT, STR_PAD_LEFT,
* or STR_PAD_BOTH. If
* pad_type is not specified it is assumed to be
* STR_PAD_RIGHT.
* </p>
* @return string the padded string.
* @since 4.0.1
* @since 5.0
*/
function str_pad ($input, $pad_length, $pad_string = null, $pad_type = null) {}