mysql手机号11_我用不小心用 mysql 的int(11) 存了 手机号,数据都有问题,有办法恢复么?...
對不起LZ了,這個答案正像Sunyanzi指出的,MySQL不是把高位字節吃掉而是轉成了Int的最大值。
考慮到原先提交的答案還是花了點心思寫的,就還留在這里了,也許對其他高位字節溢出的問題有所幫助。
這個有點意思,問題出在int只有4個字節,而手機號碼是11位的十進制值由5個字節組成,所以轉成int后最高位的第5個字節被“吃掉了”,然后就杯具了。
解決思路:
把丟失的那個字節找回來。
按照當前手機號碼范圍130 0000 0000到189 9999 9999經分析,丟失的高位字節可能是0x03或者0x04。
因此加上0x03或者0x04恢復后的值(Long長整型)符合手機號碼范圍/格式,就可以得到原始值了。
遺留問題: 有可能出現加0x03和0x04都符合手機號碼范圍/格式的情況,取加0x04的結果(沒法子的事情)
好了,上代碼(Java)代碼:
/**
* 按照當前手機號碼范圍130 0000 0000到189 9999 9999經分析,丟失的高位字節可能是0x03或者0x04。
* 因此加上0x03或者0x04恢復后的值(Long長整型)符合手機號碼范圍/格式,就可以得到原始值了。
* 有可能出現加0x03和0x04都符合手機號碼范圍/格式的情況,取加0x04的結果(沒法子的事情)
*
* @param original 溢出前的原始11位手機號碼
* @return 轉int之后,再重新恢復得到的11位手機號碼
*/
public static long recover(long original) {
Pattern p = Pattern.compile("1[3,4,5,8]\\d{9}");
// 更精確的手機號段,但可能不是最新的,這里先不使用。參考: http://wenku.baidu.com/view/9d088df30242a8956bece435.html
// Pattern.compile("(133|153|180|181|189|134|135|136|137|138|139|150|151|152|157|158|159|182|183|187|188|130|131|132|155|156|185|186|145|147)\\d{8}");
int errorInt = (int) original;
System.out.println("溢出前的long值:" + original);
System.out.println("溢出后的int值:" + errorInt);
System.out.println("溢出前的16進制值:" + Long.toHexString(original));
String hexA = "000000000000" + Long.toHexString(errorInt);
hexA = hexA.substring(hexA.length() - 8);
System.out.println("溢出后的16進制值(左補0):" + Long.toHexString(errorInt));
String hex1 = "4" + hexA;
System.out.println("補全后的16進制值1:" + hex1);
BigInteger bi1 = new BigInteger(hex1, 16);
long rt1 = bi1.longValue();
System.out.println("補全后的Long值:" + rt1);
String hex2 = "3" + hexA;
System.out.println("補全后的16進制值2:" + hex2);
BigInteger bi2 = new BigInteger(hex2, 16);
long rt2 = bi2.longValue();
System.out.println("補全后的Long值2:" + rt2);
final boolean m1 = p.matcher(String.valueOf(rt1)).matches();
final boolean m2 = p.matcher(String.valueOf(rt2)).matches();
long rt = 0;
if (m1 && m2) {
// 加3加4都符合手機號碼格式
System.err.println("加3加4都符合手機號碼格式的溢出后int值:" + errorInt + ". 2個可能的恢復值為: " + rt1 + ", " + rt2);
//有可能出現加0x03和0x04都符合手機號碼范圍/格式的情況,取加0x04的結果(沒法子的事情)
rt = rt1;
} else {
if (m1) {
rt = rt1;
}
if (m2) {
rt = rt2;
}
}
System.out.println("恢復后的符合手機號碼格式的值:" + rt + "\n\n");
return rt;
}
總結
以上是生活随笔為你收集整理的mysql手机号11_我用不小心用 mysql 的int(11) 存了 手机号,数据都有问题,有办法恢复么?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql四种事务级别_【MySQL 知
- 下一篇: js 根据掩码位计算可用ip地址_变长子