MYSQL FLOAT 使用详解,MYSQL FLOAT出现错误的举例分析
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
小(单精度)浮点数。允许的值是-3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。
M是小数纵位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。单精度浮点数精确到大约7位小数位。
如果指定UNSIGNED,不允许负值。
使用浮点数可能会遇到意想不到的问题,因为在MySQL中的所有计算用双精度完成。参见A.5.7节,“解决与不匹配行有关的问题”。
· DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
普通大小(双精度)浮点数。允许的值是-1.7976931348623157E+308到-2.2250738585072014E-308、0和2.2250738585072014E-308到 1.7976931348623157E+308。这些是理论限制,基于IEEE标准。实际的范围根据硬件或操作系统的不同可能稍微小些。
M是小数总位数,D是小数点后面的位数。如果M和D被省略,根据硬件允许的限制来保存值。双精度浮点数精确到大约15位小数位。
如果指定UNSIGNED,不允许负值。
· DOUBLE PRECISION[(M,D)] [UNSIGNED] [ZEROFILL], REAL[(M,D)] [UNSIGNED] [ZEROFILL]
为DOUBLE的同义词。除了:如果SQL服务器模式包括REAL_AS_FLOAT选项,REAL是FLOAT的同义词而不是DOUBLE的同义词。
· FLOAT(p) [UNSIGNED] [ZEROFILL]
浮点数。p表示精度(以位数表示),但MySQL只使用该值来确定是否结果列的数据类型为FLOAT或DOUBLE。如果p为从0到24,数据类型变为没有M或D值的FLOAT。如果p为从25到53,数据类型变为没有M或D值的DOUBLE。结果列范围与本节前面描述的单精度FLOAT或双精度DOUBLE数据类型相同。
FLOAT(p)语法与ODBC兼容。
· DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
压缩的“严格”定点数。M是小数位数(精度)的总数,D是小数点(标度)后面的位数。小数点和(负数)的‘-’符号不包括在M中。如果D是0,则值没有小数点或分数部分。DECIMAL整数最大位数(M)为65。支持的十进制数的最大位数(D)是30。如果D被省略, 默认是0。如果M被省略, 默认是10。
如果指定UNSIGNED,不允许负值。
所有DECIMAL列的基本计算(+,-,*,/)用65位精度完成。
· DEC[(M[,D])] [UNSIGNED] [ZEROFILL], NUMERIC[(M[,D])] [UNSIGNED] [ZEROFILL], FIXED[(M[,D])] [UNSIGNED] [ZEROFILL]
是DECIMAL的同义词。FIXED同义词适用于与其它服务器的兼容性。
要得到1位或2位精确小数的话,整数不能高于 32767
即:f<32767.99
因为 2E15=32768
所以最多只能正确处理0~32767的整数,
要得到3位 精确 小数的话,整数不能高于16383
即:f< 16383 .999
因为 2E14=16384
要得到4位 精确 小数,整数不能高于2047
即:f< 2047 .9999
而 2E11=2048
要得到5位 精确 小数,整数不能高于127
即:f< 127 .99999
而 2E7=128
要得到6位 精确 小数,整数不能高于15
即:f<15 .999999
而 2E4=16
要得到7位 [...]
解决.sql大文件无法导入的问题 phpmyadmin 上传文件大小限制的解决方法
用Navicat for MySQL 这个软件中的批处理任务导入.sql文件,经常会出现错误乱码的现象,所以一般用phpmyadmin导入文件和导出文件不会出现乱码的现象
但是 使用phpmyadmin导入.sql文件时有一个限制,开始是不能大于2M,所以要对php.ini的参数进行更改,以下是更改方法,更改后需要重新启动;
一般几十M的文件 都没有问题,我本地测试了100M的.sql文件都可以导入,当修改好php.ini的参数后,如果文件太大,浏览器会出现假死的现象,这里建议还是把内存设置调大一点,还要看机器的硬件支持了;
假死就等长一点时间,可以在任务管理器中看到mysql nt的进程使用很大,所以一般是内存不足的原因,最后看到
Import has been successfully finished, 2262 queries executed.
这一句就是说明所有的数据都成功导入了
下面是php.ini的参数设置
1、打开php.ini。找到 upload_max_filesize 、 memory_limit 、 post_max_size 这三个参数!
(在默认的情况下,phpmyadmin只允许最大的上传数据为2M,也就是2048KB,而极限的最大使用内存memory_limit也仅为128M,Post的最大也为2M)
2、按您的服务器的实际性能配置进行如下改动:(注意:以下是按我的服务器性能有硬件配置进行的更改..)
upload_max_filesize = 8M (上传最大极限设定为8M,这个应该足够一般的文件WEB上传了)
memory_limit = 512M (因为服务器的内存为2GB,所以这里加到512M不过份吧)
post_max_size = 8M (Post数据最大也设置为8MB,这个跟upload_max一样)
3、改完之后,我再重新执行导入命令后:
Import has been successfully finished, 399 queries executed.
(显示导入成功,有多少个请求处理成功…)
(备注:改完后当你在到phpMyadmin的导入命令行时,虽然(有时候可能会仍然显示为:最大限制:2048KB/Max: 2,048KiB);但实际上你已经可以导入不超过8M的数据库gzip导出的备份文件了! 另,改完php.ini后,别忘了重启一下web服务或者是服务器哟!重启后升效!)
Import has been successfully finished, 2262 queries executed.
日期:2010年05月30日 | 分类:
PHP,
数据库
MYSQL数据出现错误Error establishing a database connection
Error establishing a database connection 数据库错误的解决方法
今天wordpress出现了这个问题,我原来以为是空间商那里后台管理有问题,搞了好久都没用,整个数据库是服务器的问题
后来我把所有wordpress数据库表全部修复和优化了一次,后来再重新打开,网站就好;
这里分析原因,
1、估计是主机数据有移动,数据库表有影响,需要修复
2、数据库冗余,需要对表进行优化整理;
3、数据库访问量过大,大量的垃圾评论和提交数据导致数据表记录错误;
其它wordpress数据库链接文件错误的情况需要修改 config.php这个文件 了
mysql服务设置不当,导致mysql连接数量超过限定值,或者应用程序设计有问题,导致大量休眠连接不能及时释放。
登陆mysql服务器
mysql -u root -p
复制代码执行指令
show processlist;
复制代码查看当前连接数量。
如果进程过多,或存在大量超时的休眠sleep连接,编辑
/etc/mysql/my.cnfvim /etc/mysql/my.cnf
复制代码在[mysqld]字段处,添加,或去掉注释
max_connections = 500 #增加mysql连接数
wait_timeout = 10 #断开超过10秒的连接
复制代码有些没有经过仔细设计,或者需要启用服务器上特定模块的插件,很可能会导致这类的问题。
mysql数据库字段内容批量替换SQL语句 REPLACE函数运用实例
批量删除文章关键词 UPDATE dede_archives SET keywords = ” 功能说明:文章内容批量替换SQL语句 update `#@__addonarticle` set body=REPLACE(body,’论坛’,’社区’) where body like “%论坛%” 以上SQL语句作用是查找所有文章带有“论坛”的词组,并将论坛替换为“社区” update `dede_addonarticle` set body=REPLACE(body,’jpg\\\”‘,’jpg\”‘) where body like “%jpg\\\”%” update dede_addonarticle set body=replace(body,’原来的字符’,’替换后的字符’) 例如:update dede_addonarticle set body=replace(body,’音乐下载’,’音乐试听’) 删除内容表.用 delete from dede_addonarticle where length(body)<10 然后执行 这样就正常运行了~ DELETE dede_archives from dede_archives left join dede_addonarticle on dede_archives.id=dede_addonarticle.aid where dede_addonarticle.aid is null
有时候遇到想替换数据库里某一字段的内容时可以用REPLACE函数:
语法如下:
UPDATE [...]
MySQL 查询重复出现次数最多的记录
在有些应用里面,我们需要查询重复次数最多的一些记录,虽然这是一个很简单的查询语句,但是对许多初学者来说,仍然有些难度,特发此文章备查。
Code:
SELECT keyword, count( * ) AS count
FROM article_keyword
GROUP BY keyword
ORDER BY count DESC
LIMIT 20
此段查询语句返回 article_keyword 表中 keyword 重复次数(count) 最多的20条记录。
Code:
SELECT DISTINCT count( * ) AS count
FROM article_keyword
GROUP BY keyword
ORDER BY count DESC
LIMIT 6
此段查询语句返回 article_keyword 表中 keyword 的重复次数(count) 排名前 6 的数值。通过添加 DISTINCT 返回唯一记录。
修改mysql表名的方法
在使用mysql时,经常遇到表名不符合规范或标准,但是表里已经有大量的数据了,如何保留数据,只更改表名呢?
可以通过建一个相同的表结构的表,把原来的数据导入到新表中,但是这样视乎很麻烦。
能否简单使用一个SQL语句就搞定呢?当然可以,mysql5.0下我们使用这样的SQL语句就可以了。
ALTER TABLE table_name RENAME TO new_table_name
例如 ALTER TABLE admin_user RENAME TO a_user
mysql使用OPTIMIZE TABLE语法 优化表、压缩表的方法
很多人认为在ACCESS中有压缩表的功能,为什么MYSQL里没有呢,其实在MYSQL中OPTIMIZE TABLE命令就是起到压缩表的功能的,即对所有文件数据的碎片进行整理,同时对整个表进行优化整理,下面来介绍一下OPTIMIZE TABLE的使用方法
要注意:当使用OPTIMIZE TABLE是整个表都会被盥锁定,不能进行其它的读写操作了,如果是网站进行维护就需要停止前台的所有操作;
如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。
在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
对于MyISAM表,OPTIMIZE TABLE按如下方式操作:
1. 如果表已经删除或分解了行,则修复表。
2. 如果未对索引页进行分类,则进行分类。
3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。
对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。请参见13.5.2.1节,“ANALYZE TABLE语法”。
使用?skip-new或?safe-mode选项可以启动mysqld。通过启动mysqld,您可以使OPTIMIZE TABLE对其它表类型起作用。
注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
OPTIMIZE TABLE语句被写入到二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。已经这么做了,因此,用于MySQL服务器的OPTIMIZE TABLE命令的作用相当于一个复制主服务器,在默认情况下,这些命令将被复制到复制从属服务器中。
mysql数据库大表的磁盘优化 mysql数据库大表磁盘陈列优化
为系统、程序和临时文件配备一个专用磁盘,如果确是进行很多修改工作,将更新日志和事务日志放在专用磁盘上。
低寻道时间对数据库磁盘非常重要。对与大表,你可以估计你将需要log(行数)/log(索引块长度/3*2/(键码长度 + 数据指针长度))+1次寻到才能找到一行。对于有500000行的表,索引Mediun int类型的列,需要log(500000) / log(1024/3*2/(3 + 2))+1=4次寻道。上述索引需要500000*7*3/2=5.2M的空间。实际上,大多数块将被缓存,所以大概只需要1-2次寻道。
然而对于写入(如上),你将需要4次寻道请求来找到在哪里存放新键码,而且一般要2次寻道来更新索引并写入一行。
对于非常大的数据库,你的应用将受到磁盘寻道速度的限制,随着数据量的增加呈N log N数据级递增。
将数据库和表分在不同的磁盘上。在MySQL中,你可以为此而使用符号链接。
条列磁盘(RAID 0)将提高读和写的吞吐量。
带镜像的条列(RAID 0+1)将更安全并提高读取的吞吐量。写入的吞吐量将有所降低。
不要对临时文件或可以很容易地重建的数据所在的磁盘使用镜像或RAID(除了RAID 0)。
在Linux上,在引导时对磁盘使用命令hdparm -m16 -d1以启用同时读写多个扇区和DMA功能。这可以将响应时间提高5~50%。
在Linux上,用async (默认)和noatime挂载磁盘(mount)。
对于某些特定应用,可以对某些特定表使用内存磁盘,但通常不需要。
mysql大数据库表的硬件优化方法
如果数据库表>2G 应该考虑使用64位的硬件结构
如果你需要庞大的数据库表(>2G),你应该考虑使用64位的硬件结构,像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用大量64位的整数,64位的CPU将提供更好的性能。
对大数据库,优化的次序一般是RAM、快速硬盘、CPU能力。
更多的内存通过将最常用的键码页面存放在内存中可以加速键码的更新。
如果不使用事务安全(transaction-safe)的表或有大表并且想避免长文件检查,一台UPS就能够在电源故障时让系统安全关闭。
对于数据库存放在一个专用服务器的系统,应该考虑1G的以太网。延迟与吞吐量同样重要。
mysql数据库导入超过文件大小错误的解决方法
.sql文件超过,导入数据库错误
库导入出错:You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
用phpmyadmin导入mysql数据库时,我的11M的数据库不能导入,默认mysql数据库最大只能导入2M..
解决方法如下:
大多数都修改php.ini中的upload_max_filesize,但修改了这个以后,还是提示这个问题;
那么更改如下几处:
修改 PHP.ini
引用
file_uploads on 是否允许通过HTTP上传文件的开关。默认为ON即是开
upload_tmp_dir – 文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_max_filesize 20m 望文生意,即允许上传文件大小的最大值。默认为2M
post_max_size 30m 指通过表单POST给PHP的所能接收的最大值,包括表单里的所有值。默认为8M
说明
一般地,设置好上述四个参数后,在网络正常的情况下,上传<=8M的文件是不成问题
但如果要上传>8M的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100M/S的上传高速,否则你还得继续设置下面的参数。
max_execution_time 300 每个PHP页面运行的最大时间值(秒),默认30秒
max_input_time 300 每个PHP页面接收数据所需的最大时间,默认60秒
memory_limit 128m 每个PHP页面所吃掉的最大内存,默认8M
引用设定 POST 数据所允许的最大大小。此设定也影响到文件上传。要上传大文件,该值必须大于 upload_max_filesize。
如果配置脚本中激活了内存限制,memory_limit 也会影响文件上传。通常说,memory_limit 应该比 post_max_size 要大。
mysql distinct 过滤掉多余的重复记录的用法
mysql提供distinct 来过滤掉多余的重复记录只保留一条
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是会直接影响到效率的。所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是我们两人都郁闷了。。。。。。。。。
下面先来看看例子:
table
id name
1 a
2 b
3 c
4 c
5 b
库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。
比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。
select distinct name from table
得到的结果是:
name
a
b
c
好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧:
select distinct name, id from table
结果会是:
id name
1 a
2 b
3 c
[...]
mysql数据库根据一段时间查询的方法
确实要查询跨年的数据,需要加上年的条件
SELECT *
FROM `table`
WHERE year( 时间字段)=year( now( ) ) and month( 时间字段) = month( now( ) ) ;
mysql按时间段查询数据的语句
时间格式为2008-06-16
查询出当天数据:
SELECT * FROM `table` WHERE date(时间字段) = curdate();
查询出当月字段:
SELECT *
FROM `table`
WHERE month( 时间字段) = month( now( ) ) ;
时间格式为1219876…… UNIX时间,只要应用“FROM_UNIXTIME( )”函数
例如查询当月:
SELECT *
FROM `table`
WHERE month( from_unixtime( reg_time ) ) = month( now( ) ) ;
查询上一个月的呢?变通一下!
SELECT *
FROM `table`
WHERE month( from_unixtime( reg_time ) [...]