Table of Contents
回复内容:
Home Backend Development PHP Tutorial mysqli 和 pdo 查询出来的类型转换

mysqli 和 pdo 查询出来的类型转换

Jun 06, 2016 pm 08:18 PM
api mysql pdo php type conversion

  1. 一直有一个问题,就是PHP用mysqli还是pdo,查询出来的结果都是int类型的数据会自动变成string类型,PHP本身弱类型。但是现在写api,直接从数据库里查出来的结果,然后json_encode 返回给客户端是不行的。java 和 oc 都是强类型 数字就是数字,字符串就是字符串。123 != "123"

这个是程序代码,用的mysqli类
mysqli 和 pdo 查询出来的类型转换

这个是表结构
mysqli 和 pdo 查询出来的类型转换

这个是查询 出来的结果
mysqli 和 pdo 查询出来的类型转换

  1. google 了好多说法,pdo倒是有解决的方法pdo查询int转换成string的问题。但是mysqli没找到,而且不知道这个究竟是什么问题。或者是有没有一些现成的类库,可以自动转换的。

回复内容:

  1. 一直有一个问题,就是PHP用mysqli还是pdo,查询出来的结果都是int类型的数据会自动变成string类型,PHP本身弱类型。但是现在写api,直接从数据库里查出来的结果,然后json_encode 返回给客户端是不行的。java 和 oc 都是强类型 数字就是数字,字符串就是字符串。123 != "123"

这个是程序代码,用的mysqli类
mysqli 和 pdo 查询出来的类型转换

这个是表结构
mysqli 和 pdo 查询出来的类型转换

这个是查询 出来的结果
mysqli 和 pdo 查询出来的类型转换

  1. google 了好多说法,pdo倒是有解决的方法pdo查询int转换成string的问题。但是mysqli没找到,而且不知道这个究竟是什么问题。或者是有没有一些现成的类库,可以自动转换的。

关闭模拟预处理时,能保持数据类型,但某些类型,输出的数据跟数据库里的值不一致:
比如float(9,2)类型的字段,字段内容为32.10,PDO关闭模拟预处理时读到的值为32.099998474121,类型为float.
也就是说开启PDO模拟预处理(默认),返回的数据类型都是string,值跟数据库存储的内容一致.
MySQL服务器没有使用预处理时,返回的是string类型的数据.

MySQLi不使用prepare查询返回的字段类型全部是string,值跟数据库存储的内容一致.
使用prepare时跟pdo_mysql关闭模拟预处理一样,返回对应类型的数据(decimal类型依旧是字符串),而且float类型的值也存在不一致.

所以,数据库中带有小数点的数据,建议使用字符串类型或decimal类型保存.

类型转换:
settype($foo, "array");
settype($foo, "bool");
settype($foo, "boolean");
settype($foo, "float");
settype($foo, "int");
settype($foo, "integer");
settype($foo, "null");
settype($foo, "object");
settype($foo, "string");
$foo = (array)$foo;
$foo = (b)$foo; // from PHP 5.2.1
$foo = (binary)$foo; // from PHP 5.2.1
$foo = (bool)$foo;
$foo = (boolean)$foo;
$foo = (double)$foo;
$foo = (float)$foo;
$foo = (int)$foo;
$foo = (integer)$foo;
$foo = (object)$foo;
$foo = (real)$foo;
$foo = (string)$foo;

可以用mysqli_result对象的fetch_field方法来获得字段的元数据。参见:PHP: mysqli_result::fetch_field - Manual。

相关方法还有fetch_fieldsfetch_field_direct

给个示例吧:

<code>//获取到$result之后
$types = array();
while ( $finfo = $result->fetch_field() ) {
    if ( in_array( $finfo->type, array(
        MYSQLI_TYPE_BIT,
        MYSQLI_TYPE_TINY,
        MYSQLI_TYPE_SHORT,
        MYSQLI_TYPE_LONG,
        MYSQLI_TYPE_LONGLONG,
        MYSQLI_TYPE_INT24
    ) ) {
        $type = 'int';
    } else if ( in_array( $finfo->type, array( 
        MYSQLI_TYPE_FLOAT,
        MYSQLI_TYPE_DOUBLE,
        MYSQLI_TYPE_DECIMAL,
        MYSQLI_TYPE_NEWDECIMAL
     ) ) {
         $type = 'float';
     } else {
         //其他需要转换的类型请自行研究
         //类型常量请参见http://php.net/manual/zh/mysqli.constants.php,MYSQLI_TYPE开头的那些就是
         $type = 'string';
     }
     $types[$finfo->name] = $type;
}

$result = $result->fetch_assoc();

foreach ( $result as $name => &$value ) {
    settype($value, $types[$name]);
}

//现在$result里的数据类型已经符合要求了</code>
Copy after login
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks ago By 尊渡假赌尊渡假赌尊渡假赌

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Unable to log in to mysql as root Unable to log in to mysql as root Apr 08, 2025 pm 04:54 PM

The main reasons why you cannot log in to MySQL as root are permission problems, configuration file errors, password inconsistent, socket file problems, or firewall interception. The solution includes: check whether the bind-address parameter in the configuration file is configured correctly. Check whether the root user permissions have been modified or deleted and reset. Verify that the password is accurate, including case and special characters. Check socket file permission settings and paths. Check that the firewall blocks connections to the MySQL server.

mysql whether to change table lock table mysql whether to change table lock table Apr 08, 2025 pm 05:06 PM

When MySQL modifys table structure, metadata locks are usually used, which may cause the table to be locked. To reduce the impact of locks, the following measures can be taken: 1. Keep tables available with online DDL; 2. Perform complex modifications in batches; 3. Operate during small or off-peak periods; 4. Use PT-OSC tools to achieve finer control.

RDS MySQL integration with Redshift zero ETL RDS MySQL integration with Redshift zero ETL Apr 08, 2025 pm 07:06 PM

Data Integration Simplification: AmazonRDSMySQL and Redshift's zero ETL integration Efficient data integration is at the heart of a data-driven organization. Traditional ETL (extract, convert, load) processes are complex and time-consuming, especially when integrating databases (such as AmazonRDSMySQL) with data warehouses (such as Redshift). However, AWS provides zero ETL integration solutions that have completely changed this situation, providing a simplified, near-real-time solution for data migration from RDSMySQL to Redshift. This article will dive into RDSMySQL zero ETL integration with Redshift, explaining how it works and the advantages it brings to data engineers and developers.

Query optimization in MySQL is essential for improving database performance, especially when dealing with large data sets Query optimization in MySQL is essential for improving database performance, especially when dealing with large data sets Apr 08, 2025 pm 07:12 PM

1. Use the correct index to speed up data retrieval by reducing the amount of data scanned select*frommployeeswherelast_name='smith'; if you look up a column of a table multiple times, create an index for that column. If you or your app needs data from multiple columns according to the criteria, create a composite index 2. Avoid select * only those required columns, if you select all unwanted columns, this will only consume more server memory and cause the server to slow down at high load or frequency times For example, your table contains columns such as created_at and updated_at and timestamps, and then avoid selecting * because they do not require inefficient query se

Do mysql need to pay Do mysql need to pay Apr 08, 2025 pm 05:36 PM

MySQL has a free community version and a paid enterprise version. The community version can be used and modified for free, but the support is limited and is suitable for applications with low stability requirements and strong technical capabilities. The Enterprise Edition provides comprehensive commercial support for applications that require a stable, reliable, high-performance database and willing to pay for support. Factors considered when choosing a version include application criticality, budgeting, and technical skills. There is no perfect option, only the most suitable option, and you need to choose carefully according to the specific situation.

The relationship between mysql user and database The relationship between mysql user and database Apr 08, 2025 pm 07:15 PM

In MySQL database, the relationship between the user and the database is defined by permissions and tables. The user has a username and password to access the database. Permissions are granted through the GRANT command, while the table is created by the CREATE TABLE command. To establish a relationship between a user and a database, you need to create a database, create a user, and then grant permissions.

Can mysql run on android Can mysql run on android Apr 08, 2025 pm 05:03 PM

MySQL cannot run directly on Android, but it can be implemented indirectly by using the following methods: using the lightweight database SQLite, which is built on the Android system, does not require a separate server, and has a small resource usage, which is very suitable for mobile device applications. Remotely connect to the MySQL server and connect to the MySQL database on the remote server through the network for data reading and writing, but there are disadvantages such as strong network dependencies, security issues and server costs.

How to optimize MySQL performance for high-load applications? How to optimize MySQL performance for high-load applications? Apr 08, 2025 pm 06:03 PM

MySQL database performance optimization guide In resource-intensive applications, MySQL database plays a crucial role and is responsible for managing massive transactions. However, as the scale of application expands, database performance bottlenecks often become a constraint. This article will explore a series of effective MySQL performance optimization strategies to ensure that your application remains efficient and responsive under high loads. We will combine actual cases to explain in-depth key technologies such as indexing, query optimization, database design and caching. 1. Database architecture design and optimized database architecture is the cornerstone of MySQL performance optimization. Here are some core principles: Selecting the right data type and selecting the smallest data type that meets the needs can not only save storage space, but also improve data processing speed.

See all articles