lyt8384

lyt8384 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑

还是没忍住注册了

个人动态

lyt8384 赞了文章 · 2017-09-07

MySQL中浮点型转字符型问题

一 问题描述

今天遇到一个刷数据的需求,是修改产品的重量(字段类型为float),修改了产品的重量之后,是需要记录到日志表中的(字段类型为varchar),表结构如下:
临时刷数据表:

CREATE TABLE `temp_170830` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `goods_sn` varchar(255) NOT NULL DEFAULT '' COMMENT '产品编码',
  `goods_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '产品重量',
  `actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '实际重量',
  `new_actual_weight` float(9,4) NOT NULL DEFAULT '0.0000' COMMENT '新的实际重量',
  `create_user` varchar(30) NOT NULL DEFAULT '' COMMENT '创建人',
  PRIMARY KEY (`id`),
  KEY `idx_goods_sn` (`goods_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=8192 DEFAULT CHARSET=utf8 COMMENT='临时刷重量表';

日志表:

CREATE TABLE `log_weight` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `goods_sn` varchar(50) NOT NULL DEFAULT '' COMMENT '产品编码',
  `which_col` varchar(100) NOT NULL DEFAULT '' COMMENT '修改字段',
  `old_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新前值',
  `new_value` varchar(50) NOT NULL DEFAULT '0.00' COMMENT '更新后值',
  `update_user` varchar(100) NOT NULL DEFAULT '' COMMENT '创建人',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `wh_update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录修改时间',
  PRIMARY KEY (`id`),
  KEY `idx_goods_sn` (`goods_sn`),
  KEY `idx_update_user` (`update_user`),
  KEY `wh_update_time` (`wh_update_time`)
) ENGINE=InnoDB AUTO_INCREMENT=14601620 DEFAULT CHARSET=utf8 COMMENT='重量修改日志';

如上面建的表所示,我需要将temp_170830表的actual_weight和new_actual_weight字段分别刷入log_weight表的old_value和new_value字段,SQL语句如下:

INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user)
SELECT goods_sn,'actual_weight',actual_weight,new_actual_weight,create_user FROM temp_170830;

本来以为到这里就已经大功告成了,毕竟只是插入一些日志记录,后来为了简单的进行核对,发现数据有些不对劲,如下图所示:
临时表数据截图:
图片描述
日志表数据截图:
图片描述
对比可以发现,插入的日志记录数据无缘无故后面多了很多位的小数,不知道从哪里冒出来的,后来一想,可能是本来浮点型的数据就是除不尽的,转成varchar的时候就把后面的那些也给带出来了,暂时也不是很确定,后续确定之后再补充,然后自己临时找了一个转varchar的方法concat,调整如下:

INSERT INTO log_weight(goods_sn, which_col, old_value, new_value, update_user)
SELECT goods_sn,'actual_weight',concat(actual_weight,''),concat(new_actual_weight,''),create_user FROM temp_170830;

顺利解决日志记录问题。

总结如下:
1 在记录价格和重量数字字段的时候,尽量不要使用浮点型!!!,浮点数坑多(比如浮点型是不能判断相等的!!!),最好是采用int整型,业务上要显示小数时,读取出来再除以相应的位数,比如99.98元,应存储9998,读取出来时,用9998/100来显示。
2 在float转varchar时,应该先把float用concat函数先转成varchar,再存储入varchar字段。

查看原文

赞 1 收藏 0 评论 0

lyt8384 回答了问题 · 2016-10-11

解决正则表达式 匹配的字符要同时存在"()",才能返回true

var re = /[0-9]{3}|(([0-9]{3}))/

关注 4 回答 3

lyt8384 关注了问题 · 2016-10-11

解决正则表达式 匹配的字符要同时存在"()",才能返回true

var re = /\(?[0-9]{3}\)?/

var str1 = '789';
console.log(re.test(str1));//返回true
var str2 = '(789)';
console.log(re.test(str2)); // 返回true


var str3 = '(788';
console.log(re.test(str3)) //返回true;
var str4 = '789)';
console.log(re.test(str4))  //返回true;

我想第3个和第4个结果返回false ,就是要'()'同时存在或不存在才能返回true,只有一个'('或')'返回flase

var re 应该怎样写?

关注 4 回答 3

lyt8384 关注了问题 · 2016-10-11

Laravel 5.3报错:`Creating default object from empty value`

这是代码:

ActivationService.php

    <?php
    
    namespace App;
    
    
    use Illuminate\Mail\Mailer;
    use Illuminate\Mail\Message;
    
    class ActivationService
    {
    
        protected $mailer;
    
        protected $activationRepo;
    
        protected $resendAfter = 24;
    
        public function __construct(Mailer $mailer, ActivationRepository $activationRepo)
        {
            $this->mailer = $mailer;
            $this->activationRepo = $activationRepo;
        }
    
        public function sendActivationMail($user)
        {
    
            if ($user->activated || !$this->shouldSend($user)) {
                return;
            }
    
            $token = $this->activationRepo->createActivation($user);
    
            $link = route('user.activate', $token);
            $message = sprintf('Activate account <a href="%s">%s</a>', $link, $link);
    
            $this->mailer->raw($message, function (Message $m) use ($user) {
                $m->to($user->email)->subject('Activation mail');
            });
    
    
        }
    
        public function activateUser($token)
        {
            $activation = $this->activationRepo->getActivationByToken($token);
    
            if ($activation === null) {
                return null;
            }
    
            $user = User::find($activation->user_id);
            //下面这行是53行.
            $user->activated = true;
    
            $user->save();
    
            $this->activationRepo->deleteActivation($token);
    
            return $user;
    
        }
    
        private function shouldSend($user)
        {
            $activation = $this->activationRepo->getActivation($user);
            return $activation === null || strtotime($activation->created_at) + 60 * 60 * $this->resendAfter < time();
        }
    
    }

错误信息:

    ErrorException in ActivationService.php line 53:
    Creating default object from empty value

53行的位置在代码中有注释,代码是$user->activated = true;

问题:
上面的代码如何解决这个错误?

关注 2 回答 1

lyt8384 回答了问题 · 2016-10-11

Laravel 5.3报错:`Creating default object from empty value`

因为$activation = $this->activationRepo->getActivationByToken($token);是你通过别的拿到的一个不为null的返回
$activation->user_id可能,也可能没值。
然后$user = User::find($activation->user_id);的时候没值,返回的是null,然后你53行$user->activated = true;就给一个空去指对象了。。。所以。。最简单你就是52行下面增加

if(!$user){
    return null;
}

不过这类你可以断点一行行看返回是啥再去找问题

关注 2 回答 1

lyt8384 回答了问题 · 2016-10-07

怎样实现浏览器扫描二维码后打开app相关页面

需要APP配合的~~你可以搜下url schema或者app schema相关文章了解下。
思路是这样的:
二维码是一个中间页面。这个页面建议直接就是下载页面。
然后这个页面JS尝试通过schema去拉起APP。
如果安装了就启动了。。没安装就停留在这个下载页面了。。

关注 4 回答 1

lyt8384 关注了问题 · 2016-10-07

怎样实现浏览器扫描二维码后打开app相关页面

怎么样实现浏览器扫描二维码后判断该手机有没有安装该app,如果安装了就打开app的相关页面,如果没有安装就直接跳转到app的下载页面,如果是app自带的二维码扫描的就继续处理业务

关注 4 回答 1

lyt8384 回答了问题 · 2016-10-07

红包教一下怎么从本地上传大文件到七牛?

后端啥语言?你用官方的DEMO都可以直接上传到七牛的。大文件一次肯定超时的。你可以用块或者片上传。
文档参考这里http://developer.qiniu.com/ar... 就行。。。

关注 2 回答 1

lyt8384 关注了问题 · 2016-10-07

红包教一下怎么从本地上传大文件到七牛?

红包教一下怎么从本地上传大文件到七牛?

QQ 1900824

关注 2 回答 1

lyt8384 回答了问题 · 2016-10-07

这个移动判断是不是哪里不对?为什么左右快速切换按键的时候会卡?

代码不完整。单看这些没啥问题。
你可以这么排查。
在关键点,例如判断key是左右那个,里面加上console.log去看下执行了多少次。
如果次数很多。那就是卡JS了。。但是如果1~2次。。那可能是卡样式了。CSS3的样式动画是很费很费性能的。还有JS的渐变式的运动。也会很费很费

关注 4 回答 2

认证与成就

  • 获得 86 次点赞
  • 获得 9 枚徽章 获得 1 枚金徽章, 获得 3 枚银徽章, 获得 5 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2015-11-03
个人主页被 792 人浏览