当我尝试用0123456789更新时,MySQL更新似乎有一个神奇的2147483647的更新。
在某个地方,MySQL似乎将任何模式中INT列上的一个数字与另一个数字相关联。我在哪里能找到这样的协会。详情如下。
这个更新完成了它应该做的事情,并为适当的行在ContactPhone2列中输入了012345678。
UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='012345678' WHERE `CustomerID`='cust-000004' and`ContactID`='1'此更新实际上在相应行的ContactPhone2列中输入2147483647,远远不是0123456789。
UPDATE `alacarte`.`customercontacts` SET `ContactPhone2`='0123456789' WHERE `CustomerID`='cust-000004' and`ContactID`='1'ContactPhone2的数据类型是INT(10),默认值为NULL,没有参数集(OK、NN、AI等),这是MYSQL日志中的数据类型。012345678更新。
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更新的日志条目。
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
发布于 2013-01-02 02:12:35
2147483647的“魔术”数是2^31-1,这是int的上限。这意味着它认为你输入的数字太大了。
最好的选择是使用varchar存储您的电话号码。请确保它足够大以处理所有预期的情况,我强烈建议使用正则表达式格式化电话号码,以便为您清除输入。如果您只需要(xxx) xxx-xxxx,而不需要扩展名或其他有趣的东西(比如国际号码),那么这里有一种简单的方法可以在php中格式化电话号码。
$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。
显然,如果您使用这个正则表达式来格式化电话号码,那么在您接受电话号码之前,应该使用这个正则表达式来验证它。
发布于 2013-01-02 02:04:42
您使用的是什么mysql版本?我不能重复。
set ContactPhone2=round('0123456789')有帮助吗?(只要换到varchar就更好了,假设你想保持领先的零。)
https://stackoverflow.com/questions/14116042
复制相似问题