‘壹’ PHP mysql_result()函数使用方法
mysql_result定义和用法
mysql_result()
函数返回结果集中一个字段的值。
mysql_result()
返回
MySQL
结果集中一个单元的内容。字段参数可以是字段的偏移量或者字段名,或者是字段表点字段名(tablename.fieldname)。如果给列起了别名('select
foo
as
bar
from...'),则用别名替代列名。
如果成功,则该函数返回字段值。如果失败,则返回
false。
调用
mysql_result()
不能和其它处理结果集的函数混合调用。
语法
mysql_result(data,row,field)
参数
描述
data
必需。规定要使用的结果标识符。该标识符是
mysql_query()
函数返回的。
row
必需。规定行号。行号从
0
开始。
field
可选。规定获取哪个字段。可以是字段偏移值,字段名或
table.fieldname。
如果该参数未规定,则该函数从指定的行获取第一个字段。
说明
当作用于很大的结果集时,应该考虑使用能够取得整行的函数。这些函数在一次函数调用中返回了多个单元的内容,比
mysql_result()
快得多。
此外请注意,在字段参数中指定数字偏移量比指定字段名或者
tablename.fieldname
要快得多。
例子
<?php
$con
=
mysql_connect("localhost",
"hello",
"321");
if
(!$con)
{
die('Could
not
connect:
'
.
mysql_error());
}
$db_selected
=
mysql_select_db("test_db",
$con);
$sql
=
"SELECT
*
from
Person";
$result
=
mysql_query($sql,$con);
echo
mysql_result($result,0);
mysql_close($con);
?>
输出类似:
Adams
php中mysqli替换mysql_result的官方方法
今天升级了php版本,顺便想把php代码中的mysql连接方式改成mysqli,因为官方自php5.3开始一直推荐mysqli
和
pdo
。不多说了,贴代码
//
错略的使用mysqli替换
if
(!function_exists('mysql_result'))
{
function
mysql_result($result,
$number,
$field=0)
{
mysqli_data_seek($result,
$number);
$row
=
mysqli_fetch_array($result);
return
$row[$field];
}
}
好了,这篇文章就介绍到这了。
‘贰’ 在mysql中自定义的函数怎么调用
调用如:select 函数名(参数列表)。
‘叁’ 详解MySQL中的SQRT函数的使用方法
MySQL的SQRT函数是用来计算出任何数量的平方根。可以使用SELECT语句找出方检定根的任意数如下:
mysql>
select
SQRT(16);
+----------+
|
SQRT(16)
|
+----------+
|
4.000000
|
+----------+
1
row
in
set
(0.00
sec)
所看到的浮点值,因为内部MySQL将处理浮点数据类型的平方根。
可以使用SQRT函数,计算出记录的平方根。了解SQRT函数更详细用法,考虑EMPLOYEE_TBL的表具有以下记录:
mysql>
SELECT
*
FROM
employee_tbl;
+------+------+------------+--------------------+
|
id
|
name
|
work_date
|
daily_typing_pages
|
+------+------+------------+--------------------+
|
1
|
John
|
2007-01-24
|
250
|
|
2
|
Ram
|
2007-05-27
|
220
|
|
3
|
Jack
|
2007-05-06
|
170
|
|
3
|
Jack
|
2007-04-06
|
100
|
|
4
|
Jill
|
2007-04-06
|
220
|
|
5
|
Zara
|
2007-06-06
|
300
|
|
5
|
Zara
|
2007-02-06
|
350
|
+------+------+------------+--------------------+
7
rows
in
set
(0.00
sec)
假设根据上面的表格,要计算所有的dialy_typing_pages的平方根,然后可以通过使用下面的命令:
mysql>
SELECT
name,
SQRT(daily_typing_pages)
->
FROM
employee_tbl;
+------+--------------------------+
|
name
|
SQRT(daily_typing_pages)
|
+------+--------------------------+
|
John
|
15.811388
|
|
Ram
|
14.832397
|
|
Jack
|
13.038405
|
|
Jack
|
10.000000
|
|
Jill
|
14.832397
|
|
Zara
|
17.320508
|
|
Zara
|
18.708287
|
+------+--------------------------+
7
rows
in
set
(0.00
sec)
‘肆’ 在mysql里怎样自定义函数,如何调用和执行
create
function
函数名称(
参数列表
)
reurns
返回值
类型
函数体
执行的方法很简单:
加载
**
create
function
<函数名称>
returns
{string|real|integer}
**
soname
<你定义的动态库位置>
释放!
**
drop
function
<函数名称>
‘伍’ 如何利用MySQL数据库使用字符串函数
方法/步骤
首先,计算字符串的字符数,可以用char_length()函数,代码如下:
select
'zhangsan',char_length('zhangsan');
如下图所示:
字符串中的length()函数,用来计算字符串的长度,代码如下:
select
'zhangsan',length('zhangsan1111');
如下图所示:
字符串函数
中有时需要将几个不同的字符串拼接在一起,这时可以利用concat(a1,a2,...)和concat_ws(b,b1,b2,...),可以将各字符串合并成一个字符串,代码如下:
select
concat('zhang','san','feng');
select
concat_ws('*','zhang','san','feng');
如下图所示:
‘陆’ MySQL的FIND_IN_SET函数使用方法分享
很多时候我们在设计数据库时有这种情况,比如:
有个文章表里面有个type字段,他存储的是文章类型,有
1头条,2推荐,3热点,4图文
.....11,12,13等等
现在有篇文章他既是
头条,又是热点,还是图文,
type中以
1,3,4的格式存储.
那们我们如何用sql查找所有type中有4图文标准的文章呢,
这就要我们的find_in_set出马的时候到了.
先看mysql手册中find_in_set函数的语法:
FIND_IN_SET(str,strlist)
假如字符串str
在由N
子链组成的字符串行表strlist
中,则返回值的范围在
1
到
N
之间。一个字符串行表就是一个由一些被‘,'符号分开的自链组成的字符串。如果第一个参数是一个常数字符串,而第二个是type
SET列,则
FIND_IN_SET()
函数被优化,使用比特计算。如果str不在strlist
或strlist
为空字符串,则返回值为
0
。如任意一个参数为NULL,则返回值为
NULL。这个函数在第一个参数包含一个逗号(‘,')时将无法正常运行。
复制代码
代码如下:
mysql>
SELECT
FIND_IN_SET('b','a,b,c,d');
->
2
用起来很简单
就以上面我说到的情况来举例:
以下为引用的内容:
复制代码
代码如下:
select
*
from
article
where
FIND_IN_SET('4',type)
‘柒’ 如何使用mysql的 c API 函数mysql
MYSQL_OPT_READ_TIMEOUT 是 MySQL c api 客户端中用来设置读取超时时间的参数。在 MySQL 的官方文档中,该参数的描述是这样的:
MYSQL_OPT_READ_TIMEOUT (argument type: unsigned int *)The timeout in seconds for each attempt to read from the server. There are retries if necessary, so the total effective timeout value is three times the option value. You can set the value so that a lost connection can be detected earlier than the TCP/IPClose_Wait_Timeout value of 10 minutes.
也就是说在需要的时候,实际的超时时间会是设定值的 3 倍。但是实际测试后发现实际的超时时间和设置的超时时间一致。
而具体什么时候发生三倍超时,在文档中没有找到。所以对 MySQL 5.7.20 的源码进行了一些分析。
使用 GDB 调试代码找了实际与 mysql server 通信的代码,如下:
其中 vio_read() 函数中,使用 recv 和 poll 来读取报文和做读取超时。net_should_retry() 函数只有在发生 EINTR 时才会返回 true。从这段代码来看是符合测试结果的,并没有对读取进行三次重试。只有在读取操作被系统中断打断时才会重试,但是这个重试并没有次数限制。
从上面代码的分析可以看出,代码的逻辑和文档的描述不符。于是在一顿搜索后,找到了一个 MySQL 的 BUG(Bug #31163)。该 BUG 报告了在MySQL5.0 中,MySQL c api 读取的实际超时时间是设置的三倍,与现有文档描述相符。于是对 MySQL 5.0.96 的代码又进行分析。
同样使用 GDB 找到了通信部分的代码。这次找到了重试三次的代码,如下:
这个版本的 MySQL api 的读写超时是直接使用的 setsockopt 设置的。第一次循环,在 A 点发生了第一次超时(虽然注释写的非阻塞,但是客户端的连接始终是阻塞模式的)。然后在 B 点将该 socket 设置为阻塞模式,C 点这里重置 retry 次数。由于设置了 alarm 第二次以后的循环会直接进入 D 点的这个分支,并且判断循环次数。作为客户端时net->retry_count 始终是 1,所以重试了两次,共计进行了 3 次 vioread 后从 E 点退出函数。
由上面的分析可知,MySQL 文档对于该参数的描述已经过时,现在的 MYSQL_OPT_READ_TIMEOUT 并不会出现三倍超时的问题。而 Bug #31163 中的处理结果也是将文档中该参数的描述更新为实际读取超时时间是设定时间的三倍。也许是 MySQL 的维护者们在后续版本更新时忘记更新文档吧。
‘捌’ mysql date函数怎么用
以每24小时作为一份时间(而非自然日),根据用户的配置有两种工作模式:带状模式中,用户仅定义开始日期时,从开始日期(含)开始,每份时间1个分片地无限增加下去;环状模式中,用户定义了开始日期和结束日期时,以结束日期(含)和开始日期(含)之间的时间份数作为分片总数(分片数量固定),以类似取模的方式路由到这些分片里。
1. DBLE 启动时,读取用户在 rule.xml 配置的 sBeginDate 来确定起始时间
2. 读取用户在 rule.xml 配置的 sPartionDay 来确定每个 MySQL 分片承载多少天内的数据
3. 读取用户在 rule.xml 配置的 dateFormat 来确定分片索引的日期格式
4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的时间类型
5. 然后求分片索引值与起始时间的差,除以 MySQL 分片承载的天数,确定所属分片
1. DBLE 启动时,读取用户在 rule.xml 配置的起始时间 sBeginDate、终止时间 sEndDate 和每个 MySQL 分片承载多少天数据 sPartionDay
2. 根据用户设置,建立起以 sBeginDate 开始,每 sPartionDay 天一个分片,直到 sEndDate 为止的一个环,把分片串联串联起来
3. 读取用户在 rule.xml 配置的 defaultNode
4. 在 DBLE 的运行过程中,用户访问使用这个算法的表时,WHERE 子句中的分片索引值(字符串),会被提取出来尝试转换成 Java 内部的日期类型
5. 然后求分片索引值与起始日期的差:如果分片索引值不早于 sBeginDate(哪怕晚于 sEndDate),就以 MySQL 分片承载的天数为模数,对分片索引值求模得到所属分片;如果分片索引值早于 sBeginDate,就会被放到 defaultNode 分片上
与MyCat的类似分片算法对比
中间件
DBLE
MyCat
分片算法种类 date 分区算法 按日期(天)分片
两种中间件的取模范围分片算法使用上无差别
开发注意点
【分片索引】1. 必须是字符串,而且 java.text.SimpleDateFormat 能基于用户指定的 dateFormat 来转换成 java.util.Date
【分片索引】2. 提供带状模式和环状模式两种模式
【分片索引】3. 带状模式以 sBeginDate(含)起,以 86400000 毫秒(24 小时整)为一份,每 sPartionDay 份为一个分片,理论上分片数量可以无限增长,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)
【分片索引】4. 环状模式以 86400000 毫秒(24 小时整)为一份,每 sPartionDay 份为一个分片,以 sBeginDate(含)到 sEndDate(含)的时间长度除以单个分片长度得到恒定的分片数量,但是出现 sBeginDate 之前的数据而且没有设定 defaultNode 的话,会路由失败(如果有 defaultNode,则路由至 defaultNode)
【分片索引】5. 无论哪种模式,分片索引字段的格式化字符串 dateFormat 由用户指定
【分片索引】6. 无论哪种模式,划分不是以日历时间为准,无法对应自然月和自然年,且会受闰秒问题影响
运维注意点
【扩容】1. 带状模式中,随着 sBeginDate 之后的数据出现,分片数量的增加无需再平衡
【扩容】2. 带状模式没有自动增添分片的能力,需要运维手工提前增加分片;如果路由策略计算出的分片并不存在时,会导致失败
【扩容】3. 环状模式中,如果新旧 [sBeginDate,sEndDate] 之间有重叠,需要进行部分数据迁移;如果新旧 [sBeginDate,sEndDate] 之间没有重叠,需要数据再平衡
配置注意点
【配置项】1. 在 rule.xml 中,可配置项为 <propertyname="sBeginDate"> 、 <propertyname="sPartionDay"> 、 <propertyname="dateFormat"> 、 <propertyname="sEndDate"> 和 <propertyname="defaultNode">
【配置项】2.在 rule.xml 中配置 <propertyname="dateFormat">,符合 java.text.SimpleDateFormat 规范的字符串,用于告知 DBLE 如何解析sBeginDate和sEndDate
【配置项】3.在 rule.xml 中配置 <propertyname="sBeginDate">,必须是符合 dateFormat 的日期字符串
【配置项】4.在 rule.xml 中配置 <propertyname="sEndDate">,必须是符合 dateFormat 的日期字符串;配置了该项使用的是环状模式,若没有配置该项则使用的是带状模式
【配置项】5.在 rule.xml 中配置 <propertyname="sPartionDay">,非负整数,该分片策略以 86400000 毫秒(24 小时整)作为一份,而 sPartionDay 告诉 DBLE 把每多少份放在同一个分片
【配置项】6.在 rule.xml 中配置 <propertyname="defaultNode"> 标签,非必须配置项,不配置该项的话,用户的分片索引值没落在 mapFile 定义
‘玖’ MySQL字符串处理函数的几种常见用法
方法/步骤
首先,计算字符串的字符数,可以用char_length()函数,代码如下:
select 'zhangsan',char_length('zhangsan');
如下图所示:
字符串中的length()函数,用来计算字符串的长度,代码如下:
select 'zhangsan',length('zhangsan1111');
如下图所示:
字符串函数中有时需要将几个不同的字符串拼接在一起,这时可以利用concat(a1,a2,...)和concat_ws(b,b1,b2,...),可以将各字符串合并成一个字符串,代码如下:
select concat('zhang','san','feng');
select concat_ws('*','zhang','san','feng');