热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql不推荐列默认值设置为null到底是为什么

MySQL不建议使用NULL作为列默认值到底为什么通常能听到的答案是使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你就知道ISNULL会使用索引.所以上述说法有漏洞

MySQL不建议使用NULL作为列默认值到底为什么

通常能听到的答案是使用了NULL值的列将会使索引失效,但是如果实际测试过一下,你就知道IS NULL会使用索引.所以上述说法有漏洞.

着急的人拉到最下边看结论


Preface


Null is a special constraint of columns.
The columns in table will be added null constrain if you do not define the column with “not null” key words explicitly
when creating the table.Many programmers like to define columns by default
because of the conveniences(reducing the judgement code of nullibility) what consequently
cause some uncertainty of query and poor performance of database.


NULL值是一种对列的特殊约束,我们创建一个新列时,如果没有明确的使用关键字not null声明该数据列,Mysql会默认的为我们添加上NULL约束.
有些开发人员在创建数据表时,由于懒惰直接使用Mysql的默认推荐设置.(即允许字段使用NULL值).而这一陋习很容易在使用NULL的场景中得出不确定的查询结果以及引起数据库性能的下降.


Introduce


Null is null means it is not anything at all,we cannot think of null is equal to ‘’ and they are totally different.
MySQL provides three operators to handle null value:“IS NULL”,“IS NOT NULL”,"<&#61;>" and a function ifnull().
IS NULL: It returns true,if the column value is null.
IS NOT NULL: It returns true,if the columns value is not null.
<&#61;>: It’s a compare operator similar with “&#61;” but not the same.It returns true even for the two null values.
(eg. null <&#61;> null is legal)
IFNULL(): Specify two input parameters,if the first is null value then returns the second one.
It’s similar with Oracle’s NVL() function.


NULL并不意味着什么都没有,我们要注意 NULL&#39;&#39;(空值)是两个完全不一样的值.MySQL中可以操作NULL值操作符主要有三个.


  • IS NULL
  • IS NOT NULL
  • <&#61;> 太空船操作符,这个操作符很像&#61;,select NULL<&#61;>NULL可以返回true,但是select NULL&#61;NULL返回false.
  • IFNULL 一个函数.怎么使用自己查吧…反正我会了

Example

Null never returns true when comparing with any other values except null with “<&#61;>”.
NULL通过任一操作符与其它值比较都会得到NULL,除了<&#61;>.

1 (root&#64;localhost mysql3306.sock)[zlm]>create table test_null(2 -> id int not null,3 -> name varchar(10)4 -> );5 Query OK, 0 rows affected (0.02 sec)6 7 (root&#64;localhost mysql3306.sock)[zlm]>insert into test_null values(1,&#39;zlm&#39;);8 Query OK, 1 row affected (0.00 sec)9
10 (root&#64;localhost mysql3306.sock)[zlm]>insert into test_null values(2,null);
11 Query OK, 1 row affected (0.00 sec)
12
13 (root&#64;localhost mysql3306.sock)[zlm]>select * from test_null;
14 &#43;----&#43;------&#43;
15 | id | name |
16 &#43;----&#43;------&#43;
17 | 1 | zlm |
18 | 2 | NULL |
19 &#43;----&#43;------&#43;
20 2 rows in set (0.00 sec)
21 // -------------------------------------->这个很有代表性<----------------------
22 (root&#64;localhost mysql3306.sock)[zlm]>select * from test_null where name&#61;null;
23 Empty set (0.00 sec)
24
25 (root&#64;localhost mysql3306.sock)[zlm]>select * from test_null where name is null;
26 &#43;----&#43;------&#43;
27 | id | name |
28 &#43;----&#43;------&#43;
29 | 2 | NULL |
30 &#43;----&#43;------&#43;
31 1 row in set (0.00 sec)
32
33 (root&#64;localhost mysql3306.sock)[zlm]>select * from test_null where name is not null;
34 &#43;----&#43;------&#43;
35 | id | name |
36 &#43;----&#43;------&#43;
37 | 1 | zlm |
38 &#43;----&#43;------&#43;
39 1 row in set (0.00 sec)
40
41 (root&#64;localhost mysql3306.sock)[zlm]>select * from test_null where null&#61;null;
42 Empty set (0.00 sec)
43
44 (root&#64;localhost mysql3306.sock)[zlm]>select * from test_null where null<>null;
45 Empty set (0.00 sec)
46
47 (root&#64;localhost mysql3306.sock)[zlm]>select * from test_null where null<&#61;>null;
48 &#43;----&#43;------&#43;
49 | id | name |
50 &#43;----&#43;------&#43;
51 | 1 | zlm |
52 | 2 | NULL |
53 &#43;----&#43;------&#43;
54 2 rows in set (0.00 sec)
55 //null<&#61;>null always return true,it&#39;s equal to "where 1&#61;1".

Null means “a missing and unknown value”.Let’s see details below.
NULL代表一个不确定的值,就算是两个NULL,它俩也不一定相等.(像不像C中未初始化的局部变量)

1 (root&#64;localhost mysql3306.sock)[zlm]>SELECT 0 IS NULL, 0 IS NOT NULL, &#39;&#39; IS NULL, &#39;&#39; IS NOT NULL;2 &#43;-----------&#43;---------------&#43;------------&#43;----------------&#43;3 | 0 IS NULL | 0 IS NOT NULL | &#39;&#39; IS NULL | &#39;&#39; IS NOT NULL |4 &#43;-----------&#43;---------------&#43;------------&#43;----------------&#43;5 | 0 | 1 | 0 | 1 |6 &#43;-----------&#43;---------------&#43;------------&#43;----------------&#43;7 1 row in set (0.00 sec)8 9 //It&#39;s not equal to zero number or vacant string.
10 //In MySQL,0 means fasle,1 means true.
11
12 (root&#64;localhost mysql3306.sock)[zlm]>SELECT 1 &#61; NULL, 1 <> NULL, 1 NULL;
13 &#43;----------&#43;-----------&#43;----------&#43;----------&#43;
14 | 1 &#61; NULL | 1 <> NULL | 1 NULL |
15 &#43;----------&#43;-----------&#43;----------&#43;----------&#43;
16 | NULL | NULL | NULL | NULL |
17 &#43;----------&#43;-----------&#43;----------&#43;----------&#43;
18 1 row in set (0.00 sec)
19
20 //It cannot be compared with number.
21 //In MySQL,null means false,too.

It truns null as a result if any expression contains null value.
任何有返回值的表达式中有NULL参与时,都会得到另外一个NULL值.

1 (root&#64;localhost mysql3306.sock)[zlm]>select ifnull(null,&#39;First is null&#39;),ifnull(null&#43;10,&#39;First is null&#39;),ifnull(concat(&#39;abc&#39;,null),&#39;First is null&#39;);2 &#43;------------------------------&#43;---------------------------------&#43;--------------------------------------------&#43;3 | ifnull(null,&#39;First is null&#39;) | ifnull(null&#43;10,&#39;First is null&#39;) | ifnull(concat(&#39;abc&#39;,null),&#39;First is null&#39;) |4 &#43;------------------------------&#43;---------------------------------&#43;--------------------------------------------&#43;5 | First is null | First is null | First is null |6 &#43;------------------------------&#43;---------------------------------&#43;--------------------------------------------&#43;7 1 row in set (0.00 sec)8 9 //null value needs to be disposed with ifnull() function,what usually causes sql statement more complex.10 //As we all know,MySQL does not support funcion index.Therefore,indexes on the column may not be used.That&#39;s really worse.

It’s diffrent when using count(*) & count(null column).
使用count(*) 或者 count(null column)结果不同,count(null column)<&#61;count(*).

1 (root&#64;localhost mysql3306.sock)[zlm]>select count(*),count(name) from test_null;2 &#43;----------&#43;-------------&#43;3 | count(*) | count(name) |4 &#43;----------&#43;-------------&#43;5 | 2 | 1 |6 &#43;----------&#43;-------------&#43;7 1 row in set (0.00 sec)8 9 //count(*) returns all rows ignore the null while count(name) returns the non-null rows in column "name".
10 // This will also leads to uncertainty if someone is unaware of the details above.如果使用者对NULL属性不熟悉,很容易统计出错误的结果.

When using distinct,group by,order by,all null values are considered as the same value.
虽然select NULL&#61;NULL的结果为false,但是在我们使用distinct,group by,order by时,NULL又被认为是相同.

1 (root&#64;localhost mysql3306.sock)[zlm]>insert into test_null values(3,null);2 Query OK, 1 row affected (0.00 sec)3 4 (root&#64;localhost mysql3306.sock)[zlm]>select distinct name from test_null;5 &#43;------&#43;6 | name |7 &#43;------&#43;8 | zlm |9 | NULL |
10 &#43;------&#43;
11 2 rows in set (0.00 sec)
12
13 //Two rows of null value returned one and the result became two.
14
15 (root&#64;localhost mysql3306.sock)[zlm]>select name from test_null group by name;
16 &#43;------&#43;
17 | name |
18 &#43;------&#43;
19 | NULL |
20 | zlm |
21 &#43;------&#43;
22 2 rows in set (0.00 sec)
23
24 //Two rows of null value were put into the same group.
25 //By default,group by will also sort the result(null row showed first).
26
27 (root&#64;localhost mysql3306.sock)[zlm]>select id,name from test_null order by name;
28 &#43;----&#43;------&#43;
29 | id | name |
30 &#43;----&#43;------&#43;
31 | 2 | NULL |
32 | 3 | NULL |
33 | 1 | zlm |
34 &#43;----&#43;------&#43;
35 3 rows in set (0.00 sec)
36
37 //Three rows were sorted(two null rows showed first).

MySQL supports to use index on column which contains null value(what’s different from oracle).
MySQL中支持在含有NULL值的列上使用索引,但是Oracle不支持.这就是我们平时所说的如果列上含有NULL那么将会使索引失效.
严格来说,这句话对与MySQL来说是不准确的.

1 (root&#64;localhost mysql3306.sock)[sysbench]>show tables;2 &#43;--------------------&#43;3 | Tables_in_sysbench |4 &#43;--------------------&#43;5 | sbtest1 |6 | sbtest10 |7 | sbtest2 |8 | sbtest3 |9 | sbtest4 |
10 | sbtest5 |
11 | sbtest6 |
12 | sbtest7 |
13 | sbtest8 |
14 | sbtest9 |
15 &#43;--------------------&#43;
16 10 rows in set (0.00 sec)
17
18 (root&#64;localhost mysql3306.sock)[sysbench]>show create table sbtest1\G
19 *************************** 1. row ***************************
20 Table: sbtest1
21 Create Table: CREATE TABLE &#96;sbtest1&#96; (
22 &#96;id&#96; int(11) NOT NULL AUTO_INCREMENT,
23 &#96;k&#96; int(11) NOT NULL DEFAULT &#39;0&#39;,
24 &#96;c&#96; char(120) NOT NULL DEFAULT &#39;&#39;,
25 &#96;pad&#96; char(60) NOT NULL DEFAULT &#39;&#39;,
26 PRIMARY KEY (&#96;id&#96;),
27 KEY &#96;k_1&#96; (&#96;k&#96;)
28 ) ENGINE&#61;InnoDB AUTO_INCREMENT&#61;100001 DEFAULT CHARSET&#61;utf8
29 1 row in set (0.00 sec)
30
31 (root&#64;localhost mysql3306.sock)[sysbench]>alter table sbtest1 modify k int null,modify c char(120) null,modify pad char(60) null;
32 Query OK, 0 rows affected (4.14 sec)
33 Records: 0 Duplicates: 0 Warnings: 0
34
35 (root&#64;localhost mysql3306.sock)[sysbench]>insert into sbtest1 values(100001,null,null,null);
36 Query OK, 1 row affected (0.00 sec)
37
38 (root&#64;localhost mysql3306.sock)[sysbench]>explain select id,k from sbtest1 where id&#61;100001;
39 &#43;----&#43;-------------&#43;---------&#43;------------&#43;-------&#43;---------------&#43;---------&#43;---------&#43;-------&#43;------&#43;----------&#43;-------&#43;
40 | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
41 &#43;----&#43;-------------&#43;---------&#43;------------&#43;-------&#43;---------------&#43;---------&#43;---------&#43;-------&#43;------&#43;----------&#43;-------&#43;
42 | 1 | SIMPLE | sbtest1 | NULL | const | PRIMARY | PRIMARY | 4 | const | 1 | 100.00 | NULL |
43 &#43;----&#43;-------------&#43;---------&#43;------------&#43;-------&#43;---------------&#43;---------&#43;---------&#43;-------&#43;------&#43;----------&#43;-------&#43;
44 1 row in set, 1 warning (0.00 sec)
45
46 (root&#64;localhost mysql3306.sock)[sysbench]>explain select id,k from sbtest1 where k is null;
47 &#43;----&#43;-------------&#43;---------&#43;------------&#43;------&#43;---------------&#43;------&#43;---------&#43;-------&#43;------&#43;----------&#43;--------------------------&#43;
48 | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
49 &#43;----&#43;-------------&#43;---------&#43;------------&#43;------&#43;---------------&#43;------&#43;---------&#43;-------&#43;------&#43;----------&#43;--------------------------&#43;
50 | 1 | SIMPLE | sbtest1 | NULL | ref | k_1 | k_1 | 5 | const | 1 | 100.00 | Using where; Using index |
51 &#43;----&#43;-------------&#43;---------&#43;------------&#43;------&#43;---------------&#43;------&#43;---------&#43;-------&#43;------&#43;----------&#43;--------------------------&#43;
52 1 row in set, 1 warning (0.00 sec)
53
54 //In the first query,the newly added row is retrieved(检索) by primary key.
55 //In the second query,the newly added row is retrieved by secondary key "k_1"
56 // It has been proved that indexes can be used on the columns which contain null value.通过explain 可以看到 mysql支持含有NULL值的列上使用索引
57 //column "k" is int datatype which occupies 4 bytes,but the value of "key_len" turn out to be 5.// what&#39;s happed?Because null value needs 1 byte to store the null flag in the rows.

这个是我自己测试的例子.

mysql> select * from test_1;
&#43;-----------&#43;------&#43;------&#43;
| name | code | id |
&#43;-----------&#43;------&#43;------&#43;
| gaoyi | wo | 1 |
| gaoyi | w | 2 |
| chuzhong | wo | 3 |
| chuzhong | w | 4 |
| xiaoxue | dd | 5 |
| xiaoxue | dfdf | 6 |
| sujianhui | su | 99 |
| sujianhui | NULL | 99 |
&#43;-----------&#43;------&#43;------&#43;
8 rows in set (0.00 sec)mysql> explain select * from test_1 where code is NULL;
&#43;----&#43;-------------&#43;--------&#43;------------&#43;------&#43;---------------&#43;------------&#43;---------&#43;-------&#43;------&#43;----------&#43;-----------------------&#43;
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;------&#43;---------------&#43;------------&#43;---------&#43;-------&#43;------&#43;----------&#43;-----------------------&#43;
| 1 | SIMPLE | test_1 | NULL | ref | index_code | index_code | 161 | const | 1 | 100.00 | Using index condition |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;------&#43;---------------&#43;------------&#43;---------&#43;-------&#43;------&#43;----------&#43;-----------------------&#43;
1 row in set, 1 warning (0.00 sec)mysql> explain select * from test_1 where code is not NULL;
&#43;----&#43;-------------&#43;--------&#43;------------&#43;-------&#43;---------------&#43;------------&#43;---------&#43;------&#43;------&#43;----------&#43;-----------------------&#43;
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;-------&#43;---------------&#43;------------&#43;---------&#43;------&#43;------&#43;----------&#43;-----------------------&#43;
| 1 | SIMPLE | test_1 | NULL | range | index_code | index_code | 161 | NULL | 7 | 100.00 | Using index condition |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;-------&#43;---------------&#43;------------&#43;---------&#43;------&#43;------&#43;----------&#43;-----------------------&#43;
1 row in set, 1 warning (0.00 sec)mysql> explain select * from test_1 where code&#61;&#39;dd&#39;;
&#43;----&#43;-------------&#43;--------&#43;------------&#43;------&#43;---------------&#43;------------&#43;---------&#43;-------&#43;------&#43;----------&#43;-----------------------&#43;
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;------&#43;---------------&#43;------------&#43;---------&#43;-------&#43;------&#43;----------&#43;-----------------------&#43;
| 1 | SIMPLE | test_1 | NULL | ref | index_code | index_code | 161 | const | 1 | 100.00 | Using index condition |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;------&#43;---------------&#43;------------&#43;---------&#43;-------&#43;------&#43;----------&#43;-----------------------&#43;
1 row in set, 1 warning (0.00 sec)mysql> explain select * from test_1 where code like "dd%";
&#43;----&#43;-------------&#43;--------&#43;------------&#43;-------&#43;---------------&#43;------------&#43;---------&#43;------&#43;------&#43;----------&#43;-----------------------&#43;
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;-------&#43;---------------&#43;------------&#43;---------&#43;------&#43;------&#43;----------&#43;-----------------------&#43;
| 1 | SIMPLE | test_1 | NULL | range | index_code | index_code | 161 | NULL | 1 | 100.00 | Using index condition |
&#43;----&#43;-------------&#43;--------&#43;------------&#43;-------&#43;---------------&#43;------------&#43;---------&#43;------&#43;------&#43;----------&#43;-----------------------&#43;
1 row in set, 1 warning (0.00 sec)

Summary 总结


null value always leads to many uncertainties when disposing sql statement.It may cause bad performance accidentally.


列中使用NULL值容易引发不受控制的事情发生,有时候还会严重托慢系统的性能.

例如:


  • null value will not be estimated in aggregate function() which may cause inaccurate results.
    对含有NULL值的列进行统计计算,eg. count(),max(),min(),结果并不符合我们的期望值.
  • null value will influence the behavior of the operations such as “distinct”,“group by”,“order by” which causes wrong sort.
    干扰排序&#xff0c;分组,去重结果.
  • null value needs ifnull() function to do judgement which makes the program code more complex.
    有的时候为了消除NULL带来的技术债务,我们需要在SQL中使用IFNULL()来确保结果可控,但是这使程序变得复杂.
  • null value needs a extra 1 byte to store the null information in the rows.
    NULL值并是占用原有的字段空间存储,而是额外申请一个字节去标注,这个字段添加了NULL约束.(就像额外的标志位一样)

As these above drawbacks,it’s not recommended to define columns with default null.
We recommand to define “not null” on all columns and use zero number & vacant string to substitute relevant data type of null.


根据以上缺点,我们并不推荐在列中设置NULL作为列的默认值,你可以使用NOT NULL消除默认设置,使用0或者&#39;&#39;空字符串来代替NULL.


参考资料

原文地址 https://www.cnblogs.com/aaron8219/p/9259379.html


推荐阅读
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 展开全部下面的代码是创建一个立方体Thisexamplescreatesanddisplaysasimplebox.#Thefirstlineloadstheinit_disp ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Oracle10g备份导入的方法及注意事项
    本文介绍了使用Oracle10g进行备份导入的方法及相关注意事项,同时还介绍了2019年独角兽企业重金招聘Python工程师的标准。内容包括导出exp命令、删用户、创建数据库、授权等操作,以及导入imp命令的使用。详细介绍了导入时的参数设置,如full、ignore、buffer、commit、feedback等。转载来源于https://my.oschina.net/u/1767754/blog/377593。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 在很多数据库中都存在一个自动增长的列,如果现在要想在oracle中完成自动增长的功能,则只能依靠序列完成,所有的自动增长操作,需要用户手工完成处理。语法:CREAT ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
author-avatar
大布丁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有