ERROR 1366 (HY000): Incorrect integer value: 'False' for column 'bd_ip' at row 1943555

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Evils798/article/details/77244736
    更改MySQL表的属性,前期没有考虑到性能问题,将存IP段的列设置了varchar类型,由于数据量询量不断增大,使用char类型存储IP地址不仅占用空间而且影响MySQL查询效率,在多表jion时性能差异就更明显了,所以存储ip用int类型,int只占用4个字节,因为省空间,空间就是效率,选用字段的一般原则是能用占用少字节的字段就不用大字段


MySQL支持5个主要几个类型是tinyint,smallint,mediumint,int,bigint

注:一般程序的字符集是gbk或者utf8,使用char类型跟字符集也有关系
   
   gbk:一个字符占2字节

   utf8:一个字符占3个字节

查看本次测试环境

1.当前MySQL版本

mysql> select version();
+------------+
| version()  |
+------------+
| 5.6.28-log |
+------------+
1 row in set (0.02 sec)


2.查询原表结构

mysql> desc domain;
+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(10)      | NO   | PRI | NULL    | auto_increment |
| bd_domain | varchar(255) | YES  | UNI | NULL    |                |
| bd_ip     | varchar(16) | YES   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+


3.创建测试表

mysql> drop table t1;
Query OK, 0 rows affected (0.08 sec)


mysql> create table t1 select * from bd_domain;
Query OK, 9053585 rows affected (3 min 44.47 sec)
Records: 9053585  Duplicates: 0  Warnings: 0


mysql> select bd_domain,bd_ip from t1 limit 6;

+------------------------+-----------+
| bd_domain              | bd_ip     |
+------------------------+-----------+
| 039b1ee.netsolhost.com | 0.0.0.0   |
| 03a6b7a.netsolhost.com | 0.0.0.0   |
| 03a6f57.netsolhost.com | 0.0.0.0   |
| 03bbec4.netsolhost.com | 0.0.0.0   |
| 0if1nl6.org            | 0.0.0.0   |
| 0x.x.gg                | 127.0.0.1 |
+------------------------+-----------+
6 rows in set (0.00 sec)

4.查询新表T1结构,bd_ip列为varchar类型

mysql> desc t1;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| id        | int(10)      | NO   |     | 0       |       |
| bd_domain | varchar(255) | YES  |     | NULL    |       |
| bd_ip     | varchar(16)  | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
3 rows in set (0.00 sec)


5.将t1表的列更改为无符号整形

mysql> UPDATE `t1` SET bd_ip =  INET_ATON(bd_ip) WHERE INET_ATON(bd_ip) is NOT NULL;
Query OK, 2588296 rows affected (2 min 2.10 sec)
Rows matched: 2588296  Changed: 2588296  Warnings: 0


6.在执行alter的时候发现第1943555行数据有问题,一般来说可能是这列存在其他字符导致无法更改属性

mysql> ALTER TABLE `t1` CHANGE `bd_ip` `bd_ip` INT UNSIGNED NOT NULL;
ERROR 1366 (HY000): Incorrect integer value: 'False' for column 'bd_ip' at row 1943555


7.现在开始查找第1943555这行数据,t1表有900多万行数据,不太可能从图形化客户端直接查找,利用id范围来确定具体行数,在根据条件定位1943555行的数据


mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|  9053585 |
+----------+
1 row in set (3.41 sec)


8.根据id范围来定位1943555这行数据,具体id分为可自行增减


mysql> select count(*) from Mdomain where id<28553491;
+----------+
| count(*) |
+----------+
|  1943553 |
+----------+
1 row in set (0.55 sec)

mysql>  select count(*) from Mdomain where id<28553498;
+----------+
| count(*) |
+----------+
|  1943555 |
+----------+
1 row in set (0.56 sec)


9.定位之后查询这行数据,bd_ip此列有False值,因此我们在更改bd_ip列属性时会爆出错误

mysql>  select bd_domain,bd_ip from t1 where id=28553497;

+--------------------+-------+
| bd_domain          | bd_ip |
+--------------------+-------+
| mysmiledoctors.com | False |
+--------------------+-------+
1 row in set (4.23 sec)


10.更新1943555这列数据,将其更新为整形数据

mysql> update  t1 set  bd_ip='0' where bd_ip='False';
Query OK, 6465286 rows affected (4 min 17.47 sec)
Rows matched: 6465286  Changed: 6465286  Warnings: 0


11.再次更改bd_ip列属性

mysql> ALTER TABLE `t1` CHANGE `bd_ip` `bd_ip` INT UNSIGNED NOT NULL;
Query OK, 9053581 rows affected (4 min 42.02 sec)
Records: 9053581  Duplicates: 0  Warnings: 0


12.查查看t1表结构

mysql>desc t1; 
+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int(10)          | NO   |     | 0       |       |
| bd_domain | varchar(255)     | YES  |     | NULL    |       |
| bd_ip     | int(10) unsigned | NO   |     | NULL    |       |
|+-----------+------------------+------+-----+---------+-------+

猜你喜欢

转载自blog.csdn.net/Evils798/article/details/77244736
今日推荐