转至 http://blog.netzhou.net/?p=93

基本上用了mysql作为oltp业务的,基本上都会配置mysql的主从,一方面用mysql的主从做数据库的读写分离,另一方面mysql本身的单机备份不是很强,一般采用主从架构,在从上进行数据备份。
在这过程中或多或少出现一些主从不同步的情况,本文将对数据主从不同步的情况进行简单的总结,在看这篇文章请注意了本文主要从数据库层面上探讨数据库的主从不一致的情况,并不对主从的本身数据不一致引起的主从不同步进行说明:
1.网络的延迟
由于mysql主从复制是基于binlog的一种异步复制,通过网络传送binlog文件,理所当然网络延迟是主从不同步的绝大多数的原因,特别是跨机房的数据同步出现这种几率非常的大,所以做读写分离,注意从业务层进行前期设计。
2.主从两台机器的负载不一致
由于mysql主从复制是主上面启动1个io线程,而从上面启动1个sql线程和1个io线程,当中任何一台机器的负载很高,忙不过来,导致其中的任何一个线程出现资源不足,都将出现主从不一致的情况。
3.max_allowed_packet设置不一致
主上面设置的max_allowed_packet比从大,当一个大的sql语句,能在主上面执行完毕,从上面设置过小,无法执行,导致的主从不一致。
4.key自增键开始的键值跟自增步长设置不一致引起的主从不一致。
5.mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致。
6.mysql本身的bug引起的主从不同步。
7.版本不一致,特别是高版本是主,低版本为从的情况下,主上面支持的功能,从上面不支持该功能。
以上是我遇到的一些主从不同步的情况。或许还有其他的一些不同步的情况,请说出你所遇到的主从不一致的情况。
基于以上情况,先保证max_allowed_packet,自增键开始点和增长点设置一致,再者牺牲部分性能在主上面开启sync_binlog,对于采用innodb的库,推荐配置下面的内容
innodb_flush_logs_at_trx_commit = 1
innodb-support_xa = 1 # Mysql 5.0 以上
innodb_safe_binlog      # Mysql 4.0

同时在从上面推荐加入下面两个参数
skip_slave_start
read_only
[图]如何安装树莓派摄像头模块 ---可以用来作监控,把图发到网上通过http协议--jackxiang。
树莓派摄像头模块(Pi Cam)发售于2013年5月。其第一个发布版本配备了500万像素的传感器,通过排线链接树莓派上的CSI接口。而Pi Cam的第二个发布版本——也被叫做Pi NoIR中,配备了相同的传感器,但没有红外线过滤装置。因此第二版的摄像头模块就像安全监控摄像机一样,可以观测到近红外线的波长(700 - 1000 nm),不过当然同时也就牺牲了一定的显色性。
阅读全文
背景:
一)近来Firefox升级后,其原来Fiddle2的插件没有了,不知是没安上还是版本问题,反正是没有了,尽管Fiddler2原理就是代理可以用AutoProxy插件代替,但是没有那个Firefox下的FiddlerHook插件还真是感觉麻烦,于是想到了这个导入导出插件的办法,将原来的插件导出后在新的Firefox里安装上的一个想法,没有对FiddlerHook作实际导入,只是作了下导出,先作下记录如下:
二)选择Built for .NET 4的fiddler4,也就会安装firefox下的插件,也就是FiddlerHook会在安装fiddler4后,在启动firefox时会提示有插件要安装,位置在D:\Program Files\Fiddler2\FiddlerHook,而fiddler2好像没有firefox插件,同时在firefox的附加组件里也找不到,但是可以找其它firefox的插件替代它,但是没有原装的fiddler4的FiddlerHook插件好用。

一、如何导出?
可用FEBE加CLEO,CLEO不用其实也没什么,只是不太方便。

FEBE下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/febe/
DownLoad ur: https://addons.mozilla.org/firefox/downloads/file/260320/febe-8.0.4-fx.xpi?src=search

CLEO下载地址:https://addons.mozilla.org/zh-CN/firefox/addon/cleo/
DownLoad ur: https://addons.mozilla.org/firefox/downloads/latest/2942/addon-2942-latest.xpi?src=search

你在FEBE选项里-选项-目录,设好目标地址就可以备份了。
在:工具-》FEBE-》执行备份。
      工具-》FEBE-》FEBE选项。
                
经实践:
选快速备份,先选择目录后,可以导出为一个xpi文件。
经实践,发现Firefox直接访问上面的链接地址无法访问,提示https安全问题,后来:
用chrome下载后,再直接拖动到Firefox的扩展里即可安装成功。

Fiddler的FiddlerHook相关信息:
https://jackxiang.com/post/7400/


在默认情况下,Fiddler不能监听Java HttpURLConnection请求。究其原因,Java的网络通信协议栈可能浏览器的通信协议栈略有区别,Fiddler监听Http请求的原理是在应用程序和操作系统网络通信层之间搭建了一个代理服务器,而Java的HttpURLConnection应该是绕过了这个代理服务器,因此Fiddler无法监听到Java HttpURLConnection请求。

解决Fiddler不能监听Java HttpURLConnection请求的基本思路就是设置代理服务器。

Fiddler官网给出的解决办法(见http://www.fiddler2.com/fiddler/help/hookup.asp#Q-JavaTraffic)是设置jvm参数,如

jre -DproxySet=true -DproxyHost=127.0.0.1 -DproxyPort=8888 MyApp
stackoverflow上的牛人们也给出了在Java代码中设置代理服务器的方法(见http://stackoverflow.com/questions/8549749/how-to-capture-https-with-fiddler-in-java),如

System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
System.setProperty("https.proxyHost", "localhost");
System.setProperty("https.proxyPort", "8888");
当然最好还是希望Fiddler自身能过增加监听Java HttpURLConnection请求的能力。

来自:http://www.2cto.com/kf/201308/234835.html
给我加上吧,分别对应下,一技术一讲解一文一武:
一)
JACK船长的航海日志——杰克·向: http://jackxiang.com
二)
向东(jack)的博客:  http://jackxiang.com
wp-video Wordpress视频插件
wp-video插件根据shortcode短代码功能制作的视频插件。
介绍
目前支持7大主流视频网站:优酷,土豆,56,搜狐,爱奇艺,腾迅,新浪,PPTV。 对PC和iOS平台均支持。在PC端,播放flash,iOS平台(包括mac电脑)以Html5播放。
对部分网站(优酷,爱奇艺,土豆)支持无广告。这里感谢YoukuAntiADs的修改播放器。

用法
注意:空间必须要支持cUrl
[video width="600" height="500"]http://v.youku.com/v_show/id_XMjU1MDc3Njg0.html[/video]

效果
可以到我的站点查看,作者网站:http://www.idayer.com/my-first-plugin-wp-video.html

历史
v1.0 支持优酷,土豆,56,搜狐,爱奇异,腾迅,新浪。
v1.01  应答大师厨房的要求增加对PPTV视频的支持
v1.1 更新播放器数据,添加插入按钮及插件说明。添加部分网站(优酷,爱奇艺,土豆)支持无广告。

来自:https://github.com/ineo6/wp_video
yum install traceroute -y
阅读全文
背景:我不是双系统,但是启动时有一个选项是ghost如果它是系统,就是双系统,家里电脑没有问题,单位电脑有经常一上班开机后就是黑屏的问题,重新启动多次,或在上电过bios后按esc才能进入,否则就黑屏,在网上查了下有专门软件,先试试。
阅读全文
在进行自动部署的时候,经常需要用脚本获取程序的最新版本号,下面是我的两个解决方案。

for SVN
# 获取XML版本的svn信息,这样可以避免不同语言的问题 __xml=`svn info --xml --incremental` # 我们可以获取到2个版本号,一个是最新版本库版本号,一个是自己的提交版本号。删除自己提交的版本号。 __revision=`echo "$__xml"|sed '/revision/!d'|sed '$d'` # 提取出版本号的数字部分 echo $__revision|sed 's/revision="\([0-9]\+\)">\?/\1/'
# 获取XML版本的svn信息,这样可以避免不同语言的问题
__xml=`svn info --xml --incremental`
# 我们可以获取到2个版本号,一个是最新版本库版本号,一个是自己的提交版本号。删除自己提交的版本号。
__revision=`echo "$__xml"|sed '/revision/!d'|sed '$d'`
# 提取出版本号的数字部分
echo $__revision|sed 's/revision="\([0-9]\+\)">\?/\1/'

for Git
Git采用的是SHA散列码作为版本号,因此它没有顺序的版本号。但我们可以通过统计Git版本库的提交次数来获得一个顺序版本号。

# 基准版本号默认是1,可以通过传递一个参数修改 get_version() { local __base=${1:-1} echo $((`git rev-list --all|wc -l` + $__base)) } get_version 7000
# 基准版本号默认是1,可以通过传递一个参数修改
get_version()
{
    local __base=${1:-1}
    echo $((`git rev-list --all|wc -l` + $__base))
}
get_version 7000

这个版本对网上搜到的那个被普遍转载的版本做了简化和调整。网上那个版本写得比较复杂,例如awk的使用没有必要,而且要统计所有提交,应该用 git rev-list --all 参数,而不是用 git rev-list HEAD。

本文链接:http://zengrong.net/post/1798.htm


Windows 下 Git 客户端的选择,TortoiseGit(乌龟git)保存用户名密码的方法:
windows下比较比较好用的git客户端有2种:

1. msysgit + TortoiseGit(乌龟git)

2. GitHub for Windows

github的windows版也用过一段时间,但还是不太习惯。所以目前仍然青睐与msysgit+乌龟git的组合。TortoiseGit在提交时总数会提示你输入用户名密码,非常麻烦。解决方案如下:

方法一:

设置 -> git 编辑本地 .git/config 增加
[credential]  
    helper = store

保存,输入一次密码后第二次就会记住密码了

方法二:

1. Windows中添加一个HOME环境变量,值为%USERPROFILE%

2. 在“开始>运行”中打开%Home%,新建一个名为“_netrc”的文件

3. 用记事本打开_netrc文件,输入Git服务器名、用户名、密码,并保存:

machine github.com       #git服务器名称
login user          #git帐号
password pwd   #git密码

在windows上建_netrc
copy con _netrc  #创建_netrc文件
#依次输入以下3行:
machine github.com    #git服务器名称
login username        #git帐号
password password     #git密码

在最后一行后输入ctrl+z,文件会自动保存并退出

再次在git上提交时就不用重复输入用户名密码了

来自:http://www.etosun.com/post/130
背景:svn pc客户端项目下的版本号发现其svn log号低于svn update的版本号的情况原因及分析,以及用哪个版本号作为项目发布版本号的最终版本。
经过排查,其原因有二:
1、自己所处项目是处在一个项目集中的一个,根下其它项目(于我同级)地方更新后,我权限不够不知道,用客户端工具也好,终端工具也好都无法看到update的最高版本号(整个根下的最高基线)。
2、update的版本号是全局版本号,而自己项目的svn log则是自己项目的版本号,以它为准才相对靠谱些。
阅读全文
FreeSbSD安装Nextcloud:
http://rasyid.net/2015/12/12/how-to-install-php-7-from-source-tar-gz-with-apache-on-freebsd-10-2/
https://project.altservice.com/issues/847

FreeBSD下用Port安装NextCloud:
https://www.freshports.org/www/nextcloud

========================================================================================
tail -f /data/htdocs/xdxp.cn/data/owncloud.log
Automatically populating $HTTP_RAW_POST_DATA is deprecated and will be removed in a future version. To avoid this warning set ‘always_populate_raw_post_data’ to ‘-1’ in php.ini and use the php://input stream instead. in Unknown on line 0

vi php.ini
将下面注释去掉,重启fpm

;always_populate_raw_post_data = -1

service php-fpm restart


=========================================================================================
文件目录 (/data/www/xdxp.cn/data) 可以被其他用户读取
请更改权限为 0770 以避免其他用户查看目录。
chmod -R 0770 /data/www/xdxp.cn/data


update-notification.js 里面是更新的JS文件,提示更新用的。

=========================================

最后从:8.2.11--V:wncloud-9.0.10,只留下config和data文件夹后,

安全及设置警告
#sudo -u www /usr/local/php/bin/php ./occ upgrade

升级出现:
由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。
Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our documentation. (List of invalid files… / Rescan…)
The "Strict-Transport-Security" HTTP header is not configured to at least "15768000" seconds. For enhanced security we recommend enabling HSTS as described in our security tips.

回退:8.2.11!!!

============================================================================================

Q:PHP 似乎没有设置好查询的系统环境变量。 用 getenv(\"PATH\") 测试只返回一个空值。
请检查PHP配置说明和服务器的 PHP 配置的 安装文档 ↗,使用 PHP-FPM 时尤其如此。
PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果.
[这个老外真是,搞不明白:]Some files have not passed the integrity check. Further information on how to resolve this issue can be found in our documentation. (List of invalid files… / Rescan…)
A:etenv问题:在php-fpm.conf 中加上 env[PATH] = /usr/local/bin:/usr/bin:/bin:/usr/local/php/bin重启一下php-fpm就可以了
From:https://bbs.vpser.net/thread-13442-1-1.html

PHP模块'文件信息'丢失:自己参考:https://www.vpser.net/manage/lnmp-php-install-ext.html 安装上phpinfo模块
"The PHP module 'fileinfo' is missing. We strongly recommend to enable this module to get best results with mime-type detection." : "PHP模块'文件信息'丢失. 我们强烈建议启用此模块以便mime类型检测取得最佳结果."

Some files have not passed the integrity check. :估计可能是与禁用函数有关,按置顶帖去掉scandir函数试试

#grep -r "由于 WebDAV 接口似乎被破坏" ./
./core/l10n/zh_CN.json:    "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",
./core/l10n/zh_CN.js:    "Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken." : "由于 WebDAV 接口似乎被破坏,因此你的网页服务器没有正确地设置来允许文件同步。",

Your Web server is not yet set up properly to allow file synchronization
“Your web server is not yet set up properly to allow file synchronization because the WebDAV interface seems to be broken.”
有关这个问题,在ownCloud官方论坛有详细说明:How to fix CalDAV|CardDAV|WebDAV problems
From:https://www.orgleaf.com/2158.html


为进行避免较大的安装时超时,你可以在你的安装目录下运行下面的命令:
./occ upgrade#sudo -u www /usr/local/php/bin/php ./occ upgrade
SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 'max_allowed_packet' bytes
Update failed
Maintenance mode is kept active
Reset log level
max_allowed_packet = 256K  ==》max_allowed_packet = 8M
Resolve: http://blog.csdn.net/petter7226/article/details/51239901

步骤一,手动升级ownCloud到8.2.11:

rsync -a /data/htdocs/xdxp.cn/ /data/htdocs/xdxp.cn_bak`date +"%Y%m%d"`/  
wget  -P /data/htdocs "https://download.owncloud.org/community/owncloud-8.2.11.tar.bz2"  
mkdir -p /data/htdocs/owncloud_latest  
rm -rf /data/htdocs/owncloud_latest/*  
tar -C /data/htdocs/owncloud_latest -xjf /data/htdocs/owncloud-8.2.11.tar.bz2  
rsync --inplace -rtv /data/htdocs/owncloud_latest/owncloud/. /data/htdocs/xdxp.cn/.  
chown -R www:www /data/htdocs/xdxp.cn
chmod -R 755 /data/htdocs/xdxp.cn
rm -rf /data/htdocs/owncloud-8.2.11.tar.bz2  
rm -rf /data/htdocs/owncloud_latest/owncloud



步骤二,再再升最新版本是9.0.9,精简成脚本和浏览器访问,脚本收集如下:

rsync -a /data/htdocs/xdxp.cn/ /data/htdocs/xdxp.cn_bak`date +"%Y%m%d"`/  
wget  -P /data/htdocs "https://download.owncloud.org/community/owncloud-9.0.9.tar.bz2"  
mkdir -p /data/htdocs/owncloud_latest  
rm -rf /data/htdocs/owncloud_latest/*  
tar -C /data/htdocs/owncloud_latest -xjf /data/htdocs/owncloud-9.0.9.tar.bz2  
rsync --inplace -rtv /data/htdocs/owncloud_latest/owncloud/. /data/htdocs/xdxp.cn/.  
chown -R www:www /data/htdocs/xdxp.cn
chmod -R 755 /data/htdocs/xdxp.cn
rm -rf /data/htdocs/owncloud-9.0.9.tar.bz2  
rm -rf /data/htdocs/owncloud_latest/owncloud



=============================================

不用删除啥文件,一步一步按下面操作就是了:
第一大步:
rsync -a xdxp.cn/ xdxp.cn_bak`date +"%Y%m%d"`/
wget https://download.owncloud.org/community/owncloud-8.2.5.tar.bz2
mkdir owncloud_latest
文件夹存在后,则:
rm -Rf owncloud_latest/*
tar -C owncloud_latest -xjf owncloud-8.2.5.tar.bz2

[root@jackxiang htdocs]# rsync --inplace -rtv owncloud_latest/owncloud/. xdxp.cn/.
sent 99396465 bytes  received 203530 bytes  4632557.91 bytes/sec
total size is 98794138  speedup is 0.99

chown -R www:www xdxp.cn

第二大步:
访问xdxp.cn 后会提示wait 一会儿,作下升级,后重新刷新即可。

刷新时会提示:
ownCloud 将会更新到版本 8.0.2。
在继续之前,请确认数据库、配置文件夹和数据文件夹已经备份。
为避免更大的安装演示,你能在你的安装目录下面运行这些命令:
./occ upgrade
———————————————————————————————
root@119.10.6.**:/data/htdocs/xdxp.cn# ./occ upgrade
PHP is configured to populate raw post data. Since PHP 5.6 this will lead to PHP throwing notices for perfectly valid code.
To fix this issue set <code>always_populate_raw_post_data</code> to <code>-1</code> in your php.ini

vi /usr/local/php/etc/php.ini
; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is
; to disable this feature. If post reading is disabled through
; enable_post_data_reading, $HTTP_RAW_POST_DATA is *NOT* populated.
; http://php.net/always-populate-raw-post-data
;always_populate_raw_post_data = On    //打开这个
==========================================================================
打这个有啥用呢,查了一这个always_populate_raw_post_data和这个WebDAV有关:
允许在 PHP 脚本中处理 WebDAV 的 HTTP 请求(例如 PROPFIND,PROPPATCH,MOVE,COPY 等)。此选项在 PHP 4.3.2 以后便不存在了。如果要取得这些请求的 POST 数据,也要设定 always_populate_raw_post_data。
WebDAV (Web-based Distributed Authoring and Versioning) 一种基于 HTTP 1.1协议的通信协议。它扩展了HTTP 1.1,在GET、POST、HEAD等几个HTTP标准方法以外添加了一些新的方法,使应用程序可直接对Web Server直接读写,并支持写文件锁定(Locking)及解锁(Unlock),还可以支持文件的版本控制。


附录,升级后代码有兼容性的问题:
==> php-error.log <==
[10-Apr-2015 02:42:49 UTC] PHP Fatal error:  Class OCA\Contacts\Share\Addressbook contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (OCP\Share_Backend::isShareTypeAllowed) in /data/htdocs/xdxp.cn/apps/contacts/lib/share/addressbook.php on line 1

成功解决办法来源链接:
https://datenfahrt.org/wiki/blog/2015/03/owncloud-update-notizen-7.0.4-to-8.0.2
操作步骤如下:
实践如下后,显示正常,升级成功(这一块owncloud感觉好像在兼容性上不是太好):
mysql> desc oc_appconfig;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| appid       | varchar(32) | NO   | PRI |         |       |
| configkey   | varchar(64) | NO   | PRI |         |       |
| configvalue | longtext    | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+


$ mysql owncloud-db-name -u username -p
mysql> update oc_appconfig set configvalue="no" WHERE appid="contacts" AND configkey="enabled";
mysql> update oc_appconfig set configvalue="no" WHERE appid="calendar" AND configkey="enabled";
mysql> update oc_appconfig set configvalue="no" WHERE appid="contacts" AND configkey="enabled";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update oc_appconfig set configvalue="no" WHERE appid="calendar" AND configkey="enabled";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0



ownCloud是一款保持更新的开源私有云系统,基于PHP5开发的。支持SQLite、MySQL、Oracle以及PostgreSQL等数据库。本文介绍的是如何手动升级的步骤。
请务必遵循以下原则升级:
1、备份原文件夹;
2、停用所有第三方apps;
3、解压最新版的安装包,覆盖到原文件夹中;
4、确认所有的文件和文件夹权限是正确的;
5、打开ownCloud首页,升级自动进行。
假设将ownCloud安装在web根目录下的./ownCloud/文件夹中,SSH登录,进入web根目录后按照如下步骤进行升级:
1、使用rsync命令的存档模式备份./ownCloud/文件夹(该模式可以保留文件权限、拥有者、时间戳等信息),执行命令如下:
rsync -a owncloud/ owncloud_bkp`date +"%Y%m%d"`/
2、官网下载最新版ownCloud,执行命令如下:
wget http://download.owncloud.org/community/owncloud-latest.tar.bz2
3、将最新版的压缩包解压到./owncloud_latest/文件夹,执行命令如下:
mkdir owncloud_latest
tar -C owncloud_latest -xjf owncloud-latest.tar.bz2
4、使用rsync命令覆盖./ownCloud/文件夹,执行命令如下:
rsync --inplace -rtv owncloud_latest/owncloud/ owncloud/
5、删除安装包(安全起见),执行命令如下:
rm -rf owncloud-latest.tar.bz2 owncloud_latest/
注意事项:
1、如果你已经上传了大量的数据,请在升级时确认硬盘空间是否足够;
2、在后台点击升级,只会下载最新版安装包到backup文件夹,并不会自动安装,同时会将config.php中的maintenance mode修改为true。
这就会导致一个错误提示“OwnCloud is in maintenance mode”,因此在手动升级后,需要将./owncloud/config/config.php中的maintenance mode从true改为false,再打开首页才能顺利升级;
3、升级到最新版的ownCloud后,经过我的测试(测试环境:CentOS6.4_x86, LAMP一键安装包),是可以很好的支持中文的(目录名和文件名皆可)。
参考原文:http://doc.owncloud.org/server/5.0/admin_manual/maintenance/update.html
解析UC/OS-II时钟中断技术阅读全文
  最近一直在看《Linux程序设计(第3版)》,照着书上的代码原封不动地敲上去,编译后就出现了à警告:隐式声明与内建函数’exit’不兼容。
警告:隐式声明与内建函数‘exit’不兼容



       原因其实很简单了,没有把stdlib.h包含进来,加上就没问题了。后来google搜索的时候发现网上很多人有这个问题,今天来记下这个问题的解决方案。

以此类推,编译后出现警告:隐式声明与内建函数’XXX’不兼容的问题所在都是因为没有包含相应的头文件,加上就OK!

来自:http://blog.csdn.net/monkey_d_meng/article/details/5565667
背景:时下都流行enum类型的使用tinyint,那enum就真没有用的价值了么?
PHP低级编程的兄弟是这样来看这个问题的,我作下笔录如下,期望能客观的理解这个enum字段的优点及缺点:
膘哥观点:
    enum有优点。但个人觉得。。。缺点更多,客观的讲:优点主要是在建数据 库的时候就可以把一些值给规范好。缺点是。。enum不适合PHP。主要是PHP是弱类型,如:你insert into ..... set a= 1,你没法知道你是想 a= '1' 还是 a= 1(a='1'是插入值1,a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号。),这是PHP和mysql 在使用enum 最大的问题。所以。。安心点啦。干脆点直接tinyint。

单曲观点:
    我觉得没什么优点,对数字型的enum,简直就是梦魇,boolean  tinyint(1) 0,1 status  tinyint(1)  1,2,3,4,5,6..tinyint欢淫你~~。如:audit_result enum(1,2,3),set audit_result = 1;...容易出现膘哥所说的混淆。

简单观点:
   少用,一般都是用tinyint替代。

天枫观点:
   我觉得除了状态直观  没什么优点,我一般直接int,tinyint([1or2or3]) 到底有啥区别?(后面会简单探讨下,这里面的1or2or3区别。)

中庸观点:
   a=1是插入enum的第一个值,尤其php弱类型的,如果int的,很少有人在sql里加双引号,基本上是不加引号的。

竖琴螺观点:
   六种情况就:tinyint(1)  -1,-2,1,2,3,4

上面各种观点重点集中在PHP这种弱类型语言对引号不重视,
程序员不写容易引起插入的语句不是自己想要的结果的问题,
容易出现int时没有用引号导致插入了新值而不是定的那个值:


结论:要插入enum的值,字段必须加引号,不加引号当然是数字,数字就是key,不是value。
规劝:
1)enum是整型这样的错误很容易发生,尤其是php弱类型的,一般新来一个人,没注意enum类型,就会犯错。
2)数据库说明清楚的话,或者可选择的全是字符串的话,还没什么,但是里面有数字,难免有新手犯错,养成加引号的习惯很重要。
最终结论:
历史原因,要把enum改成tinyint程序改动太大了,用了的没必要改·~,以后新建的时候,尽量使用tinyint就好。
这种字段的重复内容过多的,索引建不建,关系不大,这种在mysql叫索引的势太低,其查询效果不太好:(英文是这么翻译的:https://jackxiang.com/post/1405/)。
————————————————————————————————————————————————————————————————————
tinyint(1)和tinyint(4)一样的,都是-127到128或者0到256。unsigned属性全是正,和c语言unsigned int有点类似:
tinyint(1)   -128 ~ 127
tinyint(1) unsigned  0 ~ 255

为何表示的最大正数比最小负数的绝对值少1呢?
第一位是符号位,1表示负数
所以负数可以到128,正数只能到127
-128正127
如:0111 1111  正数  ,负数 1111 1111
提问:
Mysql里int(1)和int(11)差别很大的,mysql的int,有个属性 ,UNSIGNED ZEROFILL  后面的ZEROFILL,就是有定义的位数不够则用零补齐对齐一下(这儿可能涉及到索引的性能罢):int,  长度(M)=5, 属性=UNSIGNED ZEROFILL(无符号,用0来填充位数),00001,00002。
但这个tinyint呢,tinyint(1)和tinyint(4)一样的?
看这文章后:http://blog.csdn.net/lysygyy/article/details/5983433
我估计:mysql这块对一个字节不像int这种四个字节要进行对其前部分进行部分字节索引,如果说tinyint(1)和tinyint(4)是一样的表示范围情况下,但mysql对tinyint数字长度位数作了可设置的限定,从理论上说其存在硬盘里的字节是不一样才是合乎逻辑的,这块估计还是为了对字节进行对齐方便索引等,以提升效率为主罢,l如:ike keyword%    索引有效,如果统一对齐,索引效果会不会更好呢?我也只是猜测。
————————————————————————————————————————————————————————————————————
在网上找了下这个enum的mysql的大体实现如下:
一)enum的存储原理我仔细查看了下手册。是这样的:
在建立这个字段时,我们会给他规定一个范围比如enum('a','b','c'),这时mysql内部会建立一张hash结构的map表,类似:0000 -> a,0001 -> b,0002 -> c。
当我插入一条数据,此字段的值位a或b或c时,他存储在里面的不是这个字符,而是对应他的索引,也就是那个0000或0001或0002。
同样,enum在mysql手册上的说明:
ENUM('value1','value2',...)
1或2个字节,取决于枚举值的个数(最多65,535个值)
除非enum的个数超过了一定数量,否则他所占的存储空间也总是1字节。


二)tinyint:
类型  字节  最小值  最大值
      (带符号的/无符号的)  (带符号的/无符号的)
TINYINT  1  -128  127
他的最小存储所占空间也是1字节。


最后,Enum,既然要用它,就不必要使用什么0,1,2来代替实际的字符串了。甚至中文字符串。他并不会对数据库性能进行多余开销。因为对于它来说,你使用'0','1','2'和'张三','李四','王五'数据表所占的存储空间一样。但是考虑到我们实际应用时数据需要从db服务器回传到web app,所以在网络传输时,当然还是尽可能的传输小数据比较好。所以如果很在意这些,还是不用它好了。


mysql中关于bit,enum,tinyint三种数据类型的差别 :
http://blog.csdn.net/shadowsniper/article/details/7071004

慎用mysql的enum字段:
http://www.neatstudio.com/show-1498-1.shtml
http://www.doc88.com/p-118691153106.html
分页: 65/272 第一页 上页 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 下页 最后页 [ 显示模式: 摘要 | 列表 ]