日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql手机号11_我用不小心用 mysql 的int(11) 存了 手机号,数据都有问题,有办法恢复么?...

發布時間:2025/3/15 数据库 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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) 存了 手机号,数据都有问题,有办法恢复么?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。