是否需要确保将正确的数据类型提交到MySQL数据库?

时间:2015-06-15 21:18:16

标签: php mysql pdo

编写PHP函数以确保从csv解析的数据被输入为正确的格式(以匹配创建表时设置的列数据类型),我已经知道默认情况下MySQL将输出所有值无论如何。

我的问题是 - 是否需要确保整数(对于已设置为仅存储整数的id列)是一个整数而不是包含数字的字符串(" 1" for例子)插入MySQL数据库之前?

如果没有,那么在MySQL中创建表时,明确说明列应该存储哪些值背后的想法是什么?

3 个答案:

答案 0 :(得分:4)

值正在字符串和整数之间转换。在MySQL中插入行时,PHP和MySQL都可以将字符串“1”转换为整数1.尝试将字符串“notanumber”传递给Integer字段,它不会起作用,因为您无法将该字符串值转换为一个号码。 MySQL在选择中返回字符串的原因是所有内容都是一种格式,可能还有其他原因 - 但是更容易知道结果中的所有内容都是字符串而不必检查它是否是整数,或者是浮点数或者别的什么。使用PHP和隐式转换这不是一个大问题,但对于像C#这样非常强类型的语言,这可以节省大量时间。你知道它是一个字符串,如果需要的话可以转换成你想要的,而不是检查大量不同的可能性。

您绝对应该在插入之前检查数据,或者至少在处理MySQL错误时如果不这样做。您可以使用isset($var)检查空值或空值,is_numeric($var)表示整数,is_float($var)表示浮点值。我建议在将所有内容放入数据库之前验证所有内容。

答案 1 :(得分:1)

许多数据类型将自动转换为MySQL中的正确类型。即将数字插入varchar字段将成为字符串。

关于说明列类型的思考有几个原因,主要是为了速度和空间优化。当然,您可以将所有字段创建为varchars,但将数字300000000存储在varchar字段中将需要(至少)9个字节,而对于整数字段,基本32位(4个字节)就足够了。比较整数(在where子句中)很容易,但字符串中的数字是不同的。即订购串猫,汽车,汽车将:汽车,汽车,猫。但是你如何订购字符串1000,1200和10000?作为字符串,它将是1000,10000,1200。数字为1000,1200和10000.

答案 2 :(得分:1)

对于整数/字符串,数据类型在插入时并不重要。您可以找到一些边缘情况,其中异常浮点值 - 字符串不能正确插入。当插入时被迫进行类型杂耍时,MySQL大部分都会做正确的事情。插入到数字类型字段中的字符串将转换为数字,就像MySQL一样。

主要问题是何时需要实际使用您插入的数据。数字v.s.字符串区别变得至关重要:

mysql> create table test (strings varchar(2), integers int);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values ('12', 12), ('2', 2), ('112', 112);
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from test;
+---------+----------+
| strings | integers |
+---------+----------+
| 12      |       12 |
| 2       |        2 |
| 112     |      112 |
+---------+----------+
3 rows in set (0.00 sec)

简单选择,通过整数字段排序:

mysql> select * from test order by integers;
+---------+----------+
| strings | integers |
+---------+----------+
| 2       |        2 |
| 12      |       12 |
| 112     |      112 |
+---------+----------+

整数排序一切正常。我们得到了很好的升序列表。

但是到了字符串的时候了:

mysql> select * from test order by strings asc;
+---------+----------+
| strings | integers |
+---------+----------+
| 112     |      112 |
| 12      |       12 |
| 2       |        2 |
+---------+----------+

哎呀...完全错了。 MySQL(正确)按字符串排序,按字符串规则,112小于2