首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL用随机但特定的条目更新列

MYSQL用随机但特定的条目更新列
EN

Stack Overflow用户
提问于 2013-01-02 01:48:52
回答 2查看 259关注 0票数 0

当我尝试用0123456789更新时,MySQL更新似乎有一个神奇的2147483647的更新。

在某个地方,MySQL似乎将任何模式中INT列上的一个数字与另一个数字相关联。我在哪里能找到这样的协会。详情如下。

这个更新完成了它应该做的事情,并为适当的行在ContactPhone2列中输入了012345678。

代码语言:javascript
复制
UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='012345678' WHERE `CustomerID`='cust-000004' and`ContactID`='1'

此更新实际上在相应行的ContactPhone2列中输入2147483647,远远不是0123456789。

代码语言:javascript
复制
UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='0123456789' WHERE `CustomerID`='cust-000004' and`ContactID`='1'

ContactPhone2的数据类型是INT(10),默认值为NULL,没有参数集(OK、NN、AI等),这是MYSQL日志中的数据类型。012345678更新。

代码语言:javascript
复制
 130101 17:51:43       89 Query set autocommit=0
 130101 17:51:44       89 Prepare   UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='012345678' WHERE `CustomerID`='cust-000004' and`ContactID`='1'
       89 Execute   UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='012345678' WHERE `CustomerID`='cust-000004' and`ContactID`='1'
       89 Query commit
       89 Close stmt

和0123456789更新的日志条目。

代码语言:javascript
复制
130101 17:51:48    89 Query set autocommit=0
130101 17:51:49    89 Prepare   UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='0123456789' WHERE `CustomerID`='cust-000004' and`ContactID`='1'
       89 Execute   UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='0123456789' WHERE `CustomerID`='cust-000004' and`ContactID`='1'
       89 Query commit
       89 Close stmt

使用0123456780进行更新,因此它不是数字的长度。

使用INT(10+)的数据库中的任何列都会发生这种情况,而在VARCHAR列上则不会发生这种情况。

更好的是,它在另一个模式上做同样的事情,这个模式是旧的模式,后来被复制和重命名,但是它在mysql中仍然是活动的,尽管它是未使用的。

列上没有运行触发器,只有一个触发器运行在ContactID列的表上。也不会出现错误。

查询通常是通过MySQL工作台进行的,尽管我曾经尝试通过终端中的shell直接输入更新查询,并得到了相同的结果。

在某个地方,MySQL似乎将任何模式中INT列上的一个数字与另一个数字相关联。我在哪里能找到这样的协会。

除了MySQL默认的设置之外,我们还没有对缓存或索引做任何事情。我们正在运行mysql 5.5.29

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-02 02:12:35

2147483647的“魔术”数是2^31-1,这是int的上限。这意味着它认为你输入的数字太大了。

最好的选择是使用varchar存储您的电话号码。请确保它足够大以处理所有预期的情况,我强烈建议使用正则表达式格式化电话号码,以便为您清除输入。如果您只需要(xxx) xxx-xxxx,而不需要扩展名或其他有趣的东西(比如国际号码),那么这里有一种简单的方法可以在php中格式化电话号码。

代码语言:javascript
复制
$phoneNumber = '1-(235) 555.1234';

$formatted = '';
if (preg_match('/1?[^0-9]*([02-9][0-9][0-9])[^0-9]*([0-9]{3})[^0-9]*([0-9]{4})/', $phoneNumber, $matches)) {
    $formatted = "($matches[1]) $matches[2]-$matches[3]";
} else {
    // phone number is invalid
}

结果将是$formatted = (235) 555-1234。正则表达式包括一个可选的1前缀,该前缀将被丢弃,并且第一个实际数字不能为1。

显然,如果您使用这个正则表达式来格式化电话号码,那么在您接受电话号码之前,应该使用这个正则表达式来验证它。

票数 2
EN

Stack Overflow用户

发布于 2013-01-02 02:04:42

您使用的是什么mysql版本?我不能重复。

set ContactPhone2=round('0123456789')有帮助吗?(只要换到varchar就更好了,假设你想保持领先的零。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14116042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档