Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否需要确保向MySQL数据库提交正确的数据类型?_Php_Mysql_Pdo - Fatal编程技术网

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

Php 是否需要确保向MySQL数据库提交正确的数据类型?,php,mysql,pdo,Php,Mysql,Pdo,在编写PHP函数以确保从csv解析的数据以正确的格式输入以匹配创建表时设置的列数据类型之后,我了解到MySQL默认情况下将以字符串形式输出所有值 因此,我的问题是——在插入MySQL数据库之前,是否需要确保设置为仅存储整数的id列的整数是整数而不是包含数字1的字符串 如果不是,那么在MySQL中显式说明创建表时列应存储哪些值的背后是什么想法?许多数据类型将自动转换为MySQL中的正确类型。也就是说,在varchar字段中插入一个数字将成为一个字符串 考虑列类型有几个原因,主要是为了速度和空间优化

在编写PHP函数以确保从csv解析的数据以正确的格式输入以匹配创建表时设置的列数据类型之后,我了解到MySQL默认情况下将以字符串形式输出所有值

因此,我的问题是——在插入MySQL数据库之前,是否需要确保设置为仅存储整数的id列的整数是整数而不是包含数字1的字符串


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

许多数据类型将自动转换为MySQL中的正确类型。也就是说,在varchar字段中插入一个数字将成为一个字符串


考虑列类型有几个原因,主要是为了速度和空间优化。当然,您可以将所有字段创建为varchar,但是在varchar字段中存储300000000个数字至少需要9个字节,而对于整数字段,基本的32位4字节就足够了。比较where子句中的整数很容易,但字符串中的数字不同。例如,订购字符串cat、cars、car将是:car、cars、cat。但是您如何订购字符串10001200和10000?作为字符串,它将是1000、10000、1200。编号为10001200和10000

许多数据类型将自动转换为MySQL中的正确类型。也就是说,在varchar字段中插入一个数字将成为一个字符串


考虑列类型有几个原因,主要是为了速度和空间优化。当然,您可以将所有字段创建为varchar,但是在varchar字段中存储300000000个数字至少需要9个字节,而对于整数字段,基本的32位4字节就足够了。比较where子句中的整数很容易,但字符串中的数字不同。例如,订购字符串cat、cars、car将是:car、cars、cat。但是您如何订购字符串10001200和10000?作为字符串,它将是1000、10000、1200。编号为10001200和10000

值正在字符串和整数之间转换。在MySQL中插入一行时,PHP和MySQL都可以将字符串1转换为整数1。尝试将字符串notanumber传递到整数字段中,它将不起作用,因为无法将该字符串值转换为数字。MySQL在SELECTION中返回字符串的原因是所有内容都是一种格式,可能还有另一个原因——但更容易知道结果中的所有内容都是字符串,而不必检查它是整数还是浮点或其他任何内容。对于PHP和隐式转换来说,这并不是什么大问题,但是对于像C这样的强类型语言来说,这可以节省很多时间。你知道这是一个字符串,如果需要的话可以转换成你想要的,而不是检查大量不同的可能性


您肯定应该在插入之前检查数据,或者至少在不检查的情况下处理MySQL错误。您可以使用isset$var检查空值或空值,is_numeric$var检查整数,is_float$var检查浮点数。我建议在将其放入数据库之前验证所有内容。

值正在字符串和整数之间转换。在MySQL中插入一行时,PHP和MySQL都可以将字符串1转换为整数1。尝试将字符串notanumber传递到整数字段中,它将不起作用,因为无法将该字符串值转换为数字。MySQL在SELECTION中返回字符串的原因是所有内容都是一种格式,可能还有另一个原因——但更容易知道结果中的所有内容都是字符串,而不必检查它是整数还是浮点或其他任何内容。对于PHP和隐式转换来说,这并不是什么大问题,但是对于像C这样的强类型语言来说,这可以节省很多时间。你知道这是一个字符串,如果需要的话可以转换成你想要的,而不是检查大量不同的可能性


您肯定应该在插入之前检查数据,或者至少在不检查的情况下处理MySQL错误。您可以使用isset$var检查空值或空值,is_numeric$var检查整数,is_float$var检查浮点数。我建议在将所有内容放入数据库之前对其进行验证。

对于int/string,插入时数据类型不太重要。您可能会发现一些边缘情况,其中作为字符串的外来浮点值无法正确插入。在大多数情况下,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)
简单选择,通过整数字段排序:< /p> 整数排序一切正常。我们得到了很好的升序列表排序

但到了弦的时候:

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

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

对于int/strings,数据类型在插入时不太重要。您可能会发现一些边缘情况,其中作为字符串的外来浮点值无法正确插入。在大多数情况下,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。

为此,请定义整数。这比你想象的要难。此外,无论您喜欢与否,CSV文件中的所有内容都是字符串。插入字符串1到int列将按预期工作。但情况并非总是如此。e、 g.在日期字段中插入一个格式不同于mysql预期的字符串日期,结果几乎总是很糟糕。mysql要求日期为yyyy-mm-dd。如果插入类似dd-yyy-mm的内容,最终将导致数据损坏。正确的转义方法取决于类型。类型背后的原因是存储要求以及您对数据的处理方式。考虑整数123456和字符串123456——对我们人类来说,它们都有6个数字/字符。但是,要存储字符,字符串中的每个数字都需要1个字节。但是,要存储数字123456,您只需要3个字节-这是一个关于存储要求的非常粗糙的示例,我们可以就此编写一本书,但基本前提是,如果您能够明智地保存数据,您不会浪费空间和RAM。如果您已经在从CSV输入时验证了数据的数据类型,在将其插入数据库之前,不需要重新验证它,前提是它没有被进一步修改,特别是在过渡期间没有通过用户输入进行修改。如果您使用参数化的prepared语句来进行数据库输入,那么您可以指定大多数MySQL库中绑定的数据类型。为此,请定义integer。这比你想象的要难。此外,无论您喜欢与否,CSV文件中的所有内容都是字符串。插入字符串1到int列将按预期工作。但情况并非总是如此。e、 g.在日期字段中插入一个格式不同于mysql预期的字符串日期,结果几乎总是很糟糕。mysql要求日期为yyyy-mm-dd。如果插入类似dd-yyy-mm的内容,最终将导致数据损坏。正确的转义方法取决于类型。类型背后的原因是存储要求以及您对数据的处理方式。考虑整数123456和字符串123456——对我们人类来说,它们都有6个数字/字符。但是,要存储字符,字符串中的每个数字都需要1个字节。但是,要存储数字123456,您只需要3个字节-这是一个关于存储要求的非常粗糙的示例,我们可以就此编写一本书,但基本前提是,如果您能够明智地保存数据,您不会浪费空间和RAM。如果您已经在从CSV输入时验证了数据的数据类型,在将其插入数据库之前,不需要重新验证它,前提是它没有被进一步修改,特别是在过渡期间没有通过用户输入进行修改。如果您使用参数化的prepared语句来进行数据库输入,那么您可以指定大多数MySQL库中绑定的数据类型。