GNOME 是一个用户界面友好的桌面环境,能够使用户很容易地使用和配置他们的计算机。 GNOME 包括一个面板(用来启动应用程序和显示状态),一个桌面(存放数据和应用程序的地方),一套标准的桌面工具和应用程序, 和一套与其他人相互协同工作的协议集。其他操作系统的用户在使用 GNOME提供的强大的图形驱动环境时会觉得很好。
安装 GNOME的最简单的方法是在FreeBSD安装过程中通过 “Desktop Configuration”菜单来进行。它们也可以很容易地从一个package或Ports Collection安装:要从网络安装GNOME,只要键入: # pkg_add -r gnome2 从源代码编译GNOME,可以使用 ports树: # cd /usr/ports/x11/gnome2 # make install clean 一旦GNOME被安装好, X Server必须被告知启动 GNOME以代替默认的窗口管理器。 如果在适当的位置已经定制好了文件.xinitrc, 简单地将启动当前窗口管理器的那行替换为 /usr/X11R6/bin/gnome-session。如果没有对配置文件做过什么特殊的改动, 只需简单地键入: % echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc 接着,键入startx, GNOME桌面环境就启动了。
Note: 如果已经使用了一个像 XDM这样的显示管理器,就不能这样做。而是,用同样的命令创建一个可执行文件.xsession。要这样做,需要先编辑文件,然后用 /usr/X11R6/bin/gnome-session替换已存在的窗口管理命令: % echo "#!/bin/sh" > ~/.xsession % echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession % chmod +x ~/.xsession 另一个选项是在登陆时配置显示管理器允许您选择窗口管理器;有关 KDE 细节会解释如何使用kdm, KDE显示管理器来做。
X11 通过“RENDER”扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序->桌面首选项->字体,然后选上 最佳形状, 最佳对比度,或者像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为1。
安装 GNOME的最简单的方法是在FreeBSD安装过程中通过 “Desktop Configuration”菜单来进行。它们也可以很容易地从一个package或Ports Collection安装:要从网络安装GNOME,只要键入: # pkg_add -r gnome2 从源代码编译GNOME,可以使用 ports树: # cd /usr/ports/x11/gnome2 # make install clean 一旦GNOME被安装好, X Server必须被告知启动 GNOME以代替默认的窗口管理器。 如果在适当的位置已经定制好了文件.xinitrc, 简单地将启动当前窗口管理器的那行替换为 /usr/X11R6/bin/gnome-session。如果没有对配置文件做过什么特殊的改动, 只需简单地键入: % echo "/usr/X11R6/bin/gnome-session" > ~/.xinitrc 接着,键入startx, GNOME桌面环境就启动了。
Note: 如果已经使用了一个像 XDM这样的显示管理器,就不能这样做。而是,用同样的命令创建一个可执行文件.xsession。要这样做,需要先编辑文件,然后用 /usr/X11R6/bin/gnome-session替换已存在的窗口管理命令: % echo "#!/bin/sh" > ~/.xsession % echo "/usr/X11R6/bin/gnome-session" >> ~/.xsession % chmod +x ~/.xsession 另一个选项是在登陆时配置显示管理器允许您选择窗口管理器;有关 KDE 细节会解释如何使用kdm, KDE显示管理器来做。
X11 通过“RENDER”扩展来支持 anti-aliasing。 GTK+ 2.0 以及更高的版本(被 GNOME使用的工具包)可以使用这个功能。 所以,使用最近的软件, anti-aliasing 可以应用在 GNOME桌面环境中。只需要依次选择 应用程序->桌面首选项->字体,然后选上 最佳形状, 最佳对比度,或者像素圆滑(LCD)。对于 GTK+ 应用程序,它们不是 GNOME 桌面的一部分,在启动程序前需要设置 环境变量GDK_USE_XFT的值为1。
1.安装CVSUP:
最好在安装时装好cvsup;
2.升组源码:
freebsd# ee /usr/share/examples/cvsup/stable-supfile
把:
default host=CHANGE_THIS.FreeBSD.org
改为:
default host=cvsup.FreeBSDchina.org
3.重新编译源码和内核
4.重新登陆系统进入单用户模式
启动时boot -s
源码和内核升级完毕
最好在安装时装好cvsup;
freebsd# cd /usr/ports/net/cvsup-without-gui/
freebsd# make install clean
freebsd# make install clean
2.升组源码:
freebsd# ee /usr/share/examples/cvsup/stable-supfile
把:
default host=CHANGE_THIS.FreeBSD.org
改为:
default host=cvsup.FreeBSDchina.org
freebsd# cvsup -g -L 2 /usr/share/examples/cvsup/stable-supfile
freebsd# cd /usr/obj
freebsd# chflags -R noschg *
freebsd# rm -rf *
freebsd# cd /usr/obj
freebsd# chflags -R noschg *
freebsd# rm -rf *
3.重新编译源码和内核
freebsd# cd /usr/src
freebsd# make buildworld
freebsd# make buildkernel KERNCONF=freebsd
freebsd# make installkernel KERNCONF=freebsd
reboot
freebsd# make buildworld
freebsd# make buildkernel KERNCONF=freebsd
freebsd# make installkernel KERNCONF=freebsd
reboot
4.重新登陆系统进入单用户模式
启动时boot -s
# adjkerntz -i //调整内核时区
# fsck -p //整理文件系统,自动修正所有可以安全地更正且不会导致数据丢失的问题
# mount -u / //装载根分区
# mount -a -t ufs //装载所有的ufs分区
# swapon -a //启动虚拟内存,打开交换空间
# mergemaster -p //选择YES
# cd /usr/src
# make installworld
# mergemaster //要安装的全选"i"
# reboot
# fsck -p //整理文件系统,自动修正所有可以安全地更正且不会导致数据丢失的问题
# mount -u / //装载根分区
# mount -a -t ufs //装载所有的ufs分区
# swapon -a //启动虚拟内存,打开交换空间
# mergemaster -p //选择YES
# cd /usr/src
# make installworld
# mergemaster //要安装的全选"i"
# reboot
源码和内核升级完毕
写了一个批量自动上传下载文件的小工具。 特点:
1. 文件名中可包含日期如TEST20070212.txt
2. 可多次运行,不会重复处理已成功的条目
3. 配置方便,异常处理完善
想来今后或许还用得上,所以放在这里晒一下。好不好用各位试下就知道了。 myftp.sh内容如下:
典型的配置范例myftp.cfg如下:
#SYSID FILE_NAME DIRECTION(DNLD/UPLD) REMOTE_PATH/ LOCAL_PATH/
0001 010YCDZ$YYYYMMDD$.txt UPLD ftp://user:passwd@10.245.62.226:21/dz/ /home/myftp/whdl/
0002 010YCJZ$YYYYMMDD$.TXT UPLD ftp://user:passwd@10.245.62.226:21/jz/ /home/myftp/whdl/
0003 010YJJS$YYYY-MM-DD$.TXT DNLD ftp://user:passwd@10.245.62.226:21/pk/js/ /home/myftp/whdl/
1. 文件名中可包含日期如TEST20070212.txt
2. 可多次运行,不会重复处理已成功的条目
3. 配置方便,异常处理完善
想来今后或许还用得上,所以放在这里晒一下。好不好用各位试下就知道了。 myftp.sh内容如下:
#!/bin/bash
#Author: Robin Guo
DATE_YYYYMMDD=`date +%Y%m%d`
DATE_YYMMDD=`date +%y%m%d`
DATE_YYYY_MM_DD=`date +%Y-%m-%d`
#日志文件~/log/YYYYMMDD.LOG
FTP_LOG=~/log/${DATE_YYYYMMDD}.LOG
#Function ftp_download
#Example:
#ftp_download ftp://interfs:qwerasdf@10.245.10.245:21/home/interfs/etc/config.test config.test
ftp_download()
{
if [ "$#" = "2" ]
then
if [ -f $2 ]
then
#文件已存在,说明上次下载已成功,可跳过
echo "INFO : $2 exists" | tee -a $FTP_LOG
else
echo "FROM : $1" | tee -a $FTP_LOG
echo "TO : $2" | tee -a $FTP_LOG
curl -s -P 21000 --connect-timeout 8 --max-time 60 $1 -o $2 > /dev/null 2>&1
CURL_RETCODE=$?
if [ "$CURL_RETCODE" = "0" ]
then
echo "INFO : downlaod $1 is ok" | tee -a $FTP_LOG
touch $2 > /dev/null 2>&1
else
echo "ERROR: download $1 is failed. curl return ($CURL_RETCODE)" | tee -a $FTP_LOG
rm -f $2 > /dev/null 2>&1
fi
fi
echo "" | tee -a $FTP_LOG
fi
}
#Function ftp_upload
#Example:
#ftp_upload uploadfile.txt ftp://interfs:qwerasdf@10.245.10.245:21/home/interfs/etc/upload.txt
ftp_upload()
{
if [ "$#" = "2" ]
then
if [ -f $1 ]
then
if [ -f $1.ok ]
then
#“文件.ok”存在,说明上次已成功上传,可跳过
echo "INFO : already upload $1" | tee -a $FTP_LOG
else
echo "FROM : $1" | tee -a $FTP_LOG
echo "TO : $2" | tee -a $FTP_LOG
curl -s -P 21000 --connect-timeout 8 --max-time 60 -T $1 $2 > /dev/null 2>&1
CURL_RETCODE=$?
if [ "$CURL_RETCODE" = "0" ]
then
#上传成功,做标记
touch ${1}.ok > /dev/null 2>&1
echo "INFO : upload $1 is ok" | tee -a $FTP_LOG
else
echo "ERROR: upload $1 is failed. curl return ($CURL_RETCODE)" | tee -a $FTP_LOG
fi
fi
else
echo "ERROR: upload failed. $1 not exists." | tee -a $FTP_LOG
fi
echo "" | tee -a $FTP_LOG
fi
}
date "+%y-%m-%d %H:%M" | tee -a $FTP_LOG
if [ "$#" != "1" ]
then
echo "Usage: ftp.sh ftp.cfg"
exit 1
fi
FTP_CONFIG=$1
if [ -f $FTP_CONFIG ]
then
echo "INFO : Config File: $FTP_CONFIG" | tee -a $FTP_LOG
echo "" | tee -a $FTP_LOG
else
echo "ERROR: Config File $FTP_CONFIG not exist" | tee -a $FTP_LOG
exit 1
fi
killall curl > /dev/null 2>&1
#从配置中读取条目
while read V_SYSID V_FILE_NAME V_DIRE V_REMOTE_PATH V_LOCAL_PATH
do
FIRST_CHAR=${V_SYSID:0:1}
if [ "$FIRST_CHAR" != "#" ]
then
#展开文件名中的日期段
FILE_NAME=${V_FILE_NAME}
FILE_NAME=${FILE_NAME/\$YYYYMMDD\$/$DATE_YYYYMMDD} # $YYYYMMDD$ to 20070120
FILE_NAME=${FILE_NAME/\$YYMMD\$/$DATEYYMMDD} # $YYMMDD$ to 070120
FILE_NAME=${FILE_NAME/\$YYYY-MM-DD\$/$DATE_YYYY_MM_DD} # $YYYY-MM-DD$ to 2007-01-20
if [ "$V_DIRE" = "DNLD" ]
then
echo "INFO : Download ${FILE_NAME} ... " | tee -a $FTP_LOG
ftp_download ${V_REMOTE_PATH}${FILE_NAME} ${V_LOCAL_PATH}${FILE_NAME}
fi
if [ "$V_DIRE" = "UPLD" ]
then
echo "INFO : Upload ${FILE_NAME}... " | tee -a $FTP_LOG
ftp_upload ${V_LOCAL_PATH}${FILE_NAME} ${V_REMOTE_PATH}${FILE_NAME}
fi
fi
done < $FTP_CONFIG
#Author: Robin Guo
DATE_YYYYMMDD=`date +%Y%m%d`
DATE_YYMMDD=`date +%y%m%d`
DATE_YYYY_MM_DD=`date +%Y-%m-%d`
#日志文件~/log/YYYYMMDD.LOG
FTP_LOG=~/log/${DATE_YYYYMMDD}.LOG
#Function ftp_download
#Example:
#ftp_download ftp://interfs:qwerasdf@10.245.10.245:21/home/interfs/etc/config.test config.test
ftp_download()
{
if [ "$#" = "2" ]
then
if [ -f $2 ]
then
#文件已存在,说明上次下载已成功,可跳过
echo "INFO : $2 exists" | tee -a $FTP_LOG
else
echo "FROM : $1" | tee -a $FTP_LOG
echo "TO : $2" | tee -a $FTP_LOG
curl -s -P 21000 --connect-timeout 8 --max-time 60 $1 -o $2 > /dev/null 2>&1
CURL_RETCODE=$?
if [ "$CURL_RETCODE" = "0" ]
then
echo "INFO : downlaod $1 is ok" | tee -a $FTP_LOG
touch $2 > /dev/null 2>&1
else
echo "ERROR: download $1 is failed. curl return ($CURL_RETCODE)" | tee -a $FTP_LOG
rm -f $2 > /dev/null 2>&1
fi
fi
echo "" | tee -a $FTP_LOG
fi
}
#Function ftp_upload
#Example:
#ftp_upload uploadfile.txt ftp://interfs:qwerasdf@10.245.10.245:21/home/interfs/etc/upload.txt
ftp_upload()
{
if [ "$#" = "2" ]
then
if [ -f $1 ]
then
if [ -f $1.ok ]
then
#“文件.ok”存在,说明上次已成功上传,可跳过
echo "INFO : already upload $1" | tee -a $FTP_LOG
else
echo "FROM : $1" | tee -a $FTP_LOG
echo "TO : $2" | tee -a $FTP_LOG
curl -s -P 21000 --connect-timeout 8 --max-time 60 -T $1 $2 > /dev/null 2>&1
CURL_RETCODE=$?
if [ "$CURL_RETCODE" = "0" ]
then
#上传成功,做标记
touch ${1}.ok > /dev/null 2>&1
echo "INFO : upload $1 is ok" | tee -a $FTP_LOG
else
echo "ERROR: upload $1 is failed. curl return ($CURL_RETCODE)" | tee -a $FTP_LOG
fi
fi
else
echo "ERROR: upload failed. $1 not exists." | tee -a $FTP_LOG
fi
echo "" | tee -a $FTP_LOG
fi
}
date "+%y-%m-%d %H:%M" | tee -a $FTP_LOG
if [ "$#" != "1" ]
then
echo "Usage: ftp.sh ftp.cfg"
exit 1
fi
FTP_CONFIG=$1
if [ -f $FTP_CONFIG ]
then
echo "INFO : Config File: $FTP_CONFIG" | tee -a $FTP_LOG
echo "" | tee -a $FTP_LOG
else
echo "ERROR: Config File $FTP_CONFIG not exist" | tee -a $FTP_LOG
exit 1
fi
killall curl > /dev/null 2>&1
#从配置中读取条目
while read V_SYSID V_FILE_NAME V_DIRE V_REMOTE_PATH V_LOCAL_PATH
do
FIRST_CHAR=${V_SYSID:0:1}
if [ "$FIRST_CHAR" != "#" ]
then
#展开文件名中的日期段
FILE_NAME=${V_FILE_NAME}
FILE_NAME=${FILE_NAME/\$YYYYMMDD\$/$DATE_YYYYMMDD} # $YYYYMMDD$ to 20070120
FILE_NAME=${FILE_NAME/\$YYMMD\$/$DATEYYMMDD} # $YYMMDD$ to 070120
FILE_NAME=${FILE_NAME/\$YYYY-MM-DD\$/$DATE_YYYY_MM_DD} # $YYYY-MM-DD$ to 2007-01-20
if [ "$V_DIRE" = "DNLD" ]
then
echo "INFO : Download ${FILE_NAME} ... " | tee -a $FTP_LOG
ftp_download ${V_REMOTE_PATH}${FILE_NAME} ${V_LOCAL_PATH}${FILE_NAME}
fi
if [ "$V_DIRE" = "UPLD" ]
then
echo "INFO : Upload ${FILE_NAME}... " | tee -a $FTP_LOG
ftp_upload ${V_LOCAL_PATH}${FILE_NAME} ${V_REMOTE_PATH}${FILE_NAME}
fi
fi
done < $FTP_CONFIG
典型的配置范例myftp.cfg如下:
#SYSID FILE_NAME DIRECTION(DNLD/UPLD) REMOTE_PATH/ LOCAL_PATH/
0001 010YCDZ$YYYYMMDD$.txt UPLD ftp://user:passwd@10.245.62.226:21/dz/ /home/myftp/whdl/
0002 010YCJZ$YYYYMMDD$.TXT UPLD ftp://user:passwd@10.245.62.226:21/jz/ /home/myftp/whdl/
0003 010YJJS$YYYY-MM-DD$.TXT DNLD ftp://user:passwd@10.245.62.226:21/pk/js/ /home/myftp/whdl/

Installation (安装)
wget http://www.monkey.org/~provos/libevent-1.3e.tar.gz
tar zxvf libevent-1.3e.tar.gz
cd libevent-1.3e/
./configure --prefix=/usr
make && make install
cd ../
wget http://dbcached.googlecode.com/files/dbcached-1.0.beta2.tar.gz
tar zxvf dbcached-1.0.beta2.tar.gz
cd dbcached-1.0.beta2/
./configure --prefix=/usr/local/dbcached --with-libevent=/usr
make && make install
cd ../
Run as a daemon (作为守护进程运行)
/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody -x 192.168.0.2 -y 26010 -z 26010
● -x {ip_addr} hostname or IP address of nmdb server
● -y {num} TCP port number of nmdb server (default: 26010) for set & get command
● -z {num} UDP port number of nmdb server (default: 26010) only for set command, UDP will be used to replace TCP for set command when using parameter -z
● -x {IP地址} nmdb 服务器的域名或者IP地址,推荐使用IP地址
● -y {端口号} nmdb 服务器的TCP端口号 (默认: 26010) 支持 set/delete/... 等写命令 和 get 等读命令
● -z {端口号} nmdb 服务器的UDP端口号 (默认: 26010) 只支持 get 等都命令, 当使用 -z 参数时,将使用 UDP 协议代替 TCP 协议执行 set 操作,执行 get 操作时仍然使用 TCP 协议。强烈推荐加上 -z 参数。
● 其他参数跟 memcached 1.2.4 完全一样,就不再详细说明。
● 如果想让 dbcached 通过 NMDB 保存数据时采用 TCP 协议,去掉 -z 参数即可,例如:(除非因防火墙、NAT穿透等问题导致 UDP 协议不可用,否则不建议使用 TCP 协议)
/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody -x 192.168.0.2 -y 26010
● 如果想让 dbcached 作为普通的 Memcached 运行,去掉 -x、-y、-z 参数即可,例如:
/usr/local/dbcached/bin/memcached -d -m 256 -p 11211 -c 51200 -u nobody
载录来源:http://code.google.com/p/dbcached/
张也转载了:http://blog.s135.com/read.php?329&guid=17
http://blog.sina.com.cn/s/blog_4d52f5a701000bav.html
http://blog.sina.com.cn/s/articlelist_1340168604_2_1.html
ubuntu下配置nginx+php+mysql+zend
http://www.zhanghaifeng.com/archives/33
CentOS 5.1下 postfix + extmail + dovecot + maildrop 最新版安装笔记:
http://hi.baidu.com/delphiss/blog/item/38571c94f7a7d50e7af48052.html
http://www.zhanghaifeng.com/archives/33
CentOS 5.1下 postfix + extmail + dovecot + maildrop 最新版安装笔记:
http://hi.baidu.com/delphiss/blog/item/38571c94f7a7d50e7af48052.html
使用共享主机,控制面版是CPANEL的朋友都知道,他默认绑定主域名的目录为public_html
所以如果想要放域名yourdomain.com能直接访问,势必需要把所有文件全直接放进public_html下。这时候如果你想再建个子站,bbs.yourdomain.com,这时BBS目录就和其他php文件或主站的文件夹混在一起,很不利于管理
可以通过.htaccess文件来实现转向
以下以cms目录和www域名为例:
/————————————-以下为.htaccess文件内容————————————————-
# 开启功能
RewriteEngine on
# 你的主域名
RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$
# 把哪个子目录你想指向主域名
# 这里以CMS为例
RewriteCond %{REQUEST_URI} !^/cms/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 你想在哪个子目录上绑定主域名,把subfolder改成子目录
RewriteRule ^(.*)$ /cms/$1
#这里改成你的主域名和子目录
RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$
RewriteRule ^(/)?$ cms/index.php [L]
//———————-OVER——————————————
以上内容就是把目录cms指向主域名
比如www.yourmaindomain.com,访问时就直接转到了cms目录
我的配置:
# 开启功能
RewriteEngine on
# 你的主域名
RewriteCond %{HTTP_HOST} ^(www.)?xiangdong.org$
# 把哪个子目录你想指向主域名
# 这里以CMS为例
RewriteCond %{REQUEST_URI} !^/mycom/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 你想在哪个子目录上绑定主域名,把subfolder改成子目录
RewriteRule ^(.*)$ /mycom/$1
#这里改成你的主域名和子目录
RewriteCond %{HTTP_HOST} ^(www.)?xiangdong.org$
RewriteRule ^(/)?$ mycom/index.php
所以如果想要放域名yourdomain.com能直接访问,势必需要把所有文件全直接放进public_html下。这时候如果你想再建个子站,bbs.yourdomain.com,这时BBS目录就和其他php文件或主站的文件夹混在一起,很不利于管理
可以通过.htaccess文件来实现转向
以下以cms目录和www域名为例:
/————————————-以下为.htaccess文件内容————————————————-
# 开启功能
RewriteEngine on
# 你的主域名
RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$
# 把哪个子目录你想指向主域名
# 这里以CMS为例
RewriteCond %{REQUEST_URI} !^/cms/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 你想在哪个子目录上绑定主域名,把subfolder改成子目录
RewriteRule ^(.*)$ /cms/$1
#这里改成你的主域名和子目录
RewriteCond %{HTTP_HOST} ^(www.)?yourmaindomain.com$
RewriteRule ^(/)?$ cms/index.php [L]
//———————-OVER——————————————
以上内容就是把目录cms指向主域名
比如www.yourmaindomain.com,访问时就直接转到了cms目录
我的配置:
# 开启功能
RewriteEngine on
# 你的主域名
RewriteCond %{HTTP_HOST} ^(www.)?xiangdong.org$
# 把哪个子目录你想指向主域名
# 这里以CMS为例
RewriteCond %{REQUEST_URI} !^/mycom/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 你想在哪个子目录上绑定主域名,把subfolder改成子目录
RewriteRule ^(.*)$ /mycom/$1
#这里改成你的主域名和子目录
RewriteCond %{HTTP_HOST} ^(www.)?xiangdong.org$
RewriteRule ^(/)?$ mycom/index.php
作者:老王
问题:主从服务器表类型的选择
一般的共识是主服务器使用innodb,从服务器使用myisam,以便各尽其能。
问题:主从服务器字段类型的选择
字段类型对于分页等操作有很大影响。主服务器一般是innodb,因为不涉及查询,所以可以使用varchar等来存储字符串来节省空间,从服务器一般是 myisam,因为涉及查询,所以必须在char和varchar之间仔细权衡,没有varchar, text, blob字段的表是静态表,反之是动态表,静态表的检索效率要比动态表好若干倍,一般来说,所有涉及大结果集的查询都应该尽可能保证在静态表上完成,这里说一个例子:比如说常见的articles表有title(varchar), body(text)等字段,在做文章列表的时候,因为不是静态表,所以查询不会很快,下面开始重构解决方案:把原来的articles表拆分成 subjects表和contents表,title字段设置为一个足够的char类型放在subjects表里,body字段还保持是text类型放到 contents表里,subjects和contents表之间的关系是一对多,这样,顺带着也方便的实现了多页文章的功能,而且更重要的是在查询文章列表的时候,操作都是在subjects静态表里完成,效率肯定会比前一种方案提升很多。
阅读全文
问题:主从服务器表类型的选择
一般的共识是主服务器使用innodb,从服务器使用myisam,以便各尽其能。
问题:主从服务器字段类型的选择
字段类型对于分页等操作有很大影响。主服务器一般是innodb,因为不涉及查询,所以可以使用varchar等来存储字符串来节省空间,从服务器一般是 myisam,因为涉及查询,所以必须在char和varchar之间仔细权衡,没有varchar, text, blob字段的表是静态表,反之是动态表,静态表的检索效率要比动态表好若干倍,一般来说,所有涉及大结果集的查询都应该尽可能保证在静态表上完成,这里说一个例子:比如说常见的articles表有title(varchar), body(text)等字段,在做文章列表的时候,因为不是静态表,所以查询不会很快,下面开始重构解决方案:把原来的articles表拆分成 subjects表和contents表,title字段设置为一个足够的char类型放在subjects表里,body字段还保持是text类型放到 contents表里,subjects和contents表之间的关系是一对多,这样,顺带着也方便的实现了多页文章的功能,而且更重要的是在查询文章列表的时候,操作都是在subjects静态表里完成,效率肯定会比前一种方案提升很多。

早就听说lighttpd加PHP的FAST-CGI方式性能不错,抽时间装了下.只是完成了环境的安装,还没具体看性能什么的!
以下是我装lighttpd+PHP(FAST-CGI)+mysql的,如有问题,请给我评论.
一、先安装MySQL
安装mysql,你可以安装源码包,也可以用编译好的!直接解压拷贝也行.我用的是直接拷贝编译好的!
1.编译源码包
./configure --prefix=/data2/ali --enable-assembler --enable-thread-safe-client --without-debug
make
make install
2.用编译好的压缩包!直接解压拷贝
tar zxf mysql-standard-5.0.27-linux-i686-glibc23.tar.gz
cd mysql-standard-5.0.27-linux-i686-glibc23
cp -rf mysql-standard-5.0.27-linux-i686-glibc23 /usr/local/mysql
//以下是为了启动多个端口
mkdir -p /data2/ali/mysql3308
mkdir -p /data2/ali/mysql3309
./scripts/mysql_install_db --ldata=/data2/ali/mysql3308
cp support-files/my-medium.cnf /data2/ali/mysql3308/my.cnf
vi /data2/ali/mysql3308/my.cnf
修改内容如下:
#
[mysqld]
datadir = /data2/ali/mysql3308/
port = 3308
socket = /tmp/mysql-3308.sock
#
cp /data2/ali/mysql3308/ /data2/ali/mysql3309/
vi /data2/ali/mysql3309/my.cnf
修改内容如下:
#
[mysqld]
datadir = /data2/ali/mysql3309/
port = 3309
socket = /tmp/mysql-3309.sock
#
启动mysql
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf --user=root &
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf --user=root &
检查mysql是否启动成功。
ps -ax|grep mysql
20835 pts/3 S 0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf --user=root
20862 pts/3 Sl 0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3308/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3308/ --user=root --pid-file=/data2/ali/mysql3308//XD_Blog_Web_132_42.pid --skip-external-locking --port=3308 --socket=/tmp/mysql-3308.sock
20872 pts/3 S 0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf --user=root
20903 pts/3 Sl 0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3309/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3309/ --user=root --pid-file=/data2/ali/mysql3309//XD_Blog_Web_132_42.pid --skip-external-locking --port=3309 --socket=/tmp/mysql-3309.sock
连接mysql
mysql -S /tmp/mysql-3108.sock
二、接着安装php
tar zxf php-5.2.4.tar.gz
cd php-5.2.4
./configure \
--prefix=/usr/local/php-fcgi \
--enable-fastcgi \
--enable-force-cgi-redirect \
--without-iconv \
--enable-mbstring \
--with-mysql=/usr/local/mysql
make
make install
复制参数文件到目标目录:
cp php.ini-dist /usr/local/php-fcgi/lib/php.ini
检查fast-cgi是否安装成功可以运行如下命令
/usr/local/php-fcgi/bin/php-cgi -v
显示如下信息,内容里包含“PHP 5.2.4 (cgi-fcgi)"表示支持fast-cgi了
PHP 5.2.4 (cgi-fcgi) (built: Oct 28 2007 20:08:41)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
三、最后安装lighttpd
1.安装配置lighttpd
1.1 首先创建运行lighttpd的用户和组
# groupadd lighttpd
# useradd -g lighttpd -s /sbin/nologin -d /dev/null lighttpd
1.2 开始安装lighttpd
# wget http://www.lighttpd.net/download/lighttpd-1.4.8.tar.gz
# tar -zxvf lighttpd-1.4.8.tar.gz
# cd lighttpd-1.4.8
# ./configure --prefix=/usr/local/lighttpd
# make
# make install
# mkdir /usr/local/lighttpd/conf
# mkdir /usr/local/lighttpd/log
# mv ./doc/lighttpd.conf /usr/local/lighttpd/conf/
# cp ./doc/rc.lighttpd.redhat /etc/init.d/lighttpd
vi conf/lighttpd.conf
将 #”mod_fastcgi”, 的#去掉
server.modules = (
"mod_rewrite",
"mod_redirect",
# "mod_alias",
"mod_access",
# "mod_cml",
# "mod_trigger_b4_dl",
# "mod_auth",
# "mod_status",
# "mod_setenv",
"mod_fastcgi",
找到fastcgi的定义
#### fastcgi module
## read fastcgi.txt for more info
## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => "/var/run/lighttpd/php-fastcgi.socket",
"bin-path" => "/usr/local/php-fcgi/bin/php-cgi"
)
)
)
一开始我把配置写"bin-path" => "/usr/local/php-fcgi/bin/php"这样,发现报错,后来改了下以上的配置,发现OK了!
启动lighttpd命令是这样的:
/usr/local/lighttpd/sbin/lighttpd -f conf/lighttpd.conf
我的:
/usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/conf/lighttpd.conf
最后可以在程序目录下建个test.php,检查一下是否正常!
最后发现在curl这儿:在command模式下可以看到curl php -m可以看到curl模块,但是通过lighttpd就说那个模块不存在。。???
以下是我装lighttpd+PHP(FAST-CGI)+mysql的,如有问题,请给我评论.
一、先安装MySQL
安装mysql,你可以安装源码包,也可以用编译好的!直接解压拷贝也行.我用的是直接拷贝编译好的!
1.编译源码包
./configure --prefix=/data2/ali --enable-assembler --enable-thread-safe-client --without-debug
make
make install
2.用编译好的压缩包!直接解压拷贝
tar zxf mysql-standard-5.0.27-linux-i686-glibc23.tar.gz
cd mysql-standard-5.0.27-linux-i686-glibc23
cp -rf mysql-standard-5.0.27-linux-i686-glibc23 /usr/local/mysql
//以下是为了启动多个端口
mkdir -p /data2/ali/mysql3308
mkdir -p /data2/ali/mysql3309
./scripts/mysql_install_db --ldata=/data2/ali/mysql3308
cp support-files/my-medium.cnf /data2/ali/mysql3308/my.cnf
vi /data2/ali/mysql3308/my.cnf
修改内容如下:
#
[mysqld]
datadir = /data2/ali/mysql3308/
port = 3308
socket = /tmp/mysql-3308.sock
#
cp /data2/ali/mysql3308/ /data2/ali/mysql3309/
vi /data2/ali/mysql3309/my.cnf
修改内容如下:
#
[mysqld]
datadir = /data2/ali/mysql3309/
port = 3309
socket = /tmp/mysql-3309.sock
#
启动mysql
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf --user=root &
/usr/local/mysql/bin/mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf --user=root &
检查mysql是否启动成功。
ps -ax|grep mysql
20835 pts/3 S 0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3308/my.cnf --user=root
20862 pts/3 Sl 0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3308/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3308/ --user=root --pid-file=/data2/ali/mysql3308//XD_Blog_Web_132_42.pid --skip-external-locking --port=3308 --socket=/tmp/mysql-3308.sock
20872 pts/3 S 0:00 /bin/sh ./mysqld_safe --defaults-file=/data2/ali/mysql3309/my.cnf --user=root
20903 pts/3 Sl 0:00 /usr/local/mysql/bin/mysqld --defaults-file=/data2/ali/mysql3309/my.cnf --basedir=/usr/local/mysql --datadir=/data2/ali/mysql3309/ --user=root --pid-file=/data2/ali/mysql3309//XD_Blog_Web_132_42.pid --skip-external-locking --port=3309 --socket=/tmp/mysql-3309.sock
连接mysql
mysql -S /tmp/mysql-3108.sock
二、接着安装php
tar zxf php-5.2.4.tar.gz
cd php-5.2.4
./configure \
--prefix=/usr/local/php-fcgi \
--enable-fastcgi \
--enable-force-cgi-redirect \
--without-iconv \
--enable-mbstring \
--with-mysql=/usr/local/mysql
make
make install
复制参数文件到目标目录:
cp php.ini-dist /usr/local/php-fcgi/lib/php.ini
检查fast-cgi是否安装成功可以运行如下命令
/usr/local/php-fcgi/bin/php-cgi -v
显示如下信息,内容里包含“PHP 5.2.4 (cgi-fcgi)"表示支持fast-cgi了
PHP 5.2.4 (cgi-fcgi) (built: Oct 28 2007 20:08:41)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies
三、最后安装lighttpd
1.安装配置lighttpd
1.1 首先创建运行lighttpd的用户和组
# groupadd lighttpd
# useradd -g lighttpd -s /sbin/nologin -d /dev/null lighttpd
1.2 开始安装lighttpd
# wget http://www.lighttpd.net/download/lighttpd-1.4.8.tar.gz
# tar -zxvf lighttpd-1.4.8.tar.gz
# cd lighttpd-1.4.8
# ./configure --prefix=/usr/local/lighttpd
# make
# make install
# mkdir /usr/local/lighttpd/conf
# mkdir /usr/local/lighttpd/log
# mv ./doc/lighttpd.conf /usr/local/lighttpd/conf/
# cp ./doc/rc.lighttpd.redhat /etc/init.d/lighttpd
vi conf/lighttpd.conf
将 #”mod_fastcgi”, 的#去掉
server.modules = (
"mod_rewrite",
"mod_redirect",
# "mod_alias",
"mod_access",
# "mod_cml",
# "mod_trigger_b4_dl",
# "mod_auth",
# "mod_status",
# "mod_setenv",
"mod_fastcgi",
找到fastcgi的定义
#### fastcgi module
## read fastcgi.txt for more info
## for PHP don't forget to set cgi.fix_pathinfo = 1 in the php.ini
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"socket" => "/var/run/lighttpd/php-fastcgi.socket",
"bin-path" => "/usr/local/php-fcgi/bin/php-cgi"
)
)
)
一开始我把配置写"bin-path" => "/usr/local/php-fcgi/bin/php"这样,发现报错,后来改了下以上的配置,发现OK了!
启动lighttpd命令是这样的:
/usr/local/lighttpd/sbin/lighttpd -f conf/lighttpd.conf
我的:
/usr/local/lighttpd/sbin/lighttpd -f /usr/local/lighttpd/conf/lighttpd.conf
最后可以在程序目录下建个test.php,检查一下是否正常!
最后发现在curl这儿:在command模式下可以看到curl php -m可以看到curl模块,但是通过lighttpd就说那个模块不存在。。???
在使用SecureCRT进行远程操作的时候,遇到一个奇怪的问题,【ctrl+l】清屏失效,按完这个组合键之后,没有任何反应,键盘是好的。输入clear命令觉得麻烦。有人遇到过这样的问题吗?
找到问题原因:“谷歌金山词霸合作版”的热键冲突了,关掉它,就OK了。。。
我喜欢在.bashrc 中加上这句 alias c='clear' 运行: source ~/.bashrc
如果不是root登陆但是su成 root的用户:source /root/.bashrc OK。。。
If还是没有搞定:
如果暂时清屏幕在Linux的terminal下还是用:cls吧。
如果在Mysql下面还是用mysql的清屏命令:system clear或system reset 吧,这样也成,试了一下:\! clear; ,斜杠转义一下。
找到问题原因:“谷歌金山词霸合作版”的热键冲突了,关掉它,就OK了。。。
我喜欢在.bashrc 中加上这句 alias c='clear' 运行: source ~/.bashrc
如果不是root登陆但是su成 root的用户:source /root/.bashrc OK。。。
If还是没有搞定:
如果暂时清屏幕在Linux的terminal下还是用:cls吧。
如果在Mysql下面还是用mysql的清屏命令:system clear或system reset 吧,这样也成,试了一下:\! clear; ,斜杠转义一下。
ssh-keygen -r rsa 在用户名下面的.ssh目录生成几个文件:
id_rsa.pub
id_rsa
id_dsa.pub
id_dsa
known_hosts
我们需要:id_rsa,放入window或者其他linux/unix来作为私钥。
/etc/rc.d/sshd rcvar
id_rsa.pub
id_rsa
id_dsa.pub
id_dsa
known_hosts
我们需要:id_rsa,放入window或者其他linux/unix来作为私钥。
/etc/rc.d/sshd rcvar
#!/usr/local/bin/php -q
<?php
function read() {
$fp=fopen("/dev/stdin", "r");
$input=fgets($fp, 255);
fclose($fp);
return $input;
}
print("What is your first name? ");
$first_name = read();
print("What is your last name? ");
$last_name = read();
print("\nHello, $first_name $last_name! Nice to meet you!\n");
?>
<?php
function read() {
$fp=fopen("/dev/stdin", "r");
$input=fgets($fp, 255);
fclose($fp);
return $input;
}
print("What is your first name? ");
$first_name = read();
print("What is your last name? ");
$last_name = read();
print("\nHello, $first_name $last_name! Nice to meet you!\n");
?>
http://www.phpe.net/articles/370.shtml
http://www.thismail.org/bbs/redirect.php?tid=2854&goto=lastpost
原始来源老外的网站:http://www.phpbuilder.com/columns/darrell20000319.php3?page=2
https://www.cnblogs.com/wcwen1990/p/6917109.html
最后谈严格模式:Mysql尽可能采用严格模式,一定程序上防止一些编码问题和长度问题(https://blog.csdn.net/fdipzone/article/details/50616247)。
set global sql_mode=''; #这种方法修改,当前会话失效后,这个修改就没意义了,建议修改配置文件的方式修改,修改后,不需要重启mysql服务,立即生效,检查是否生效,执行sql ,select @@sql_mode;
show create table t;
CREATE TABLE `t` (
`c` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
show variables like "%char%";
set names gbk;
mysql> select c ,hex(c) from t;
+------+--------+
| c | hex(c) |
+------+--------+
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
+------+--------+
8 rows in set (0.00 sec)
php igbk.php
string(4) "b6ab"
int(1)
string(4) "b6ab"
string(4) "b6ab"
Array
(
[0] => Array
(
[c] => 东
[0] => 东
[hex] => E4B89C
[1] => E4B89C
)
说明三个问题:
1)咱们在显示一个字符时,在SecureCRT里配置的character encoding只是显示,并不像Mysql的set names utf8里的三个参数(character_set_client character_set_connection character_set_results )有由一个字符转向另一个字符集的功效,要想显示正常,则只需要对转出来的结果进行匹配即可显示正常。bin2hex("东")
三条:
一)如果character_set_client和character_set_results 一般情况下要一致,因为一个表示客户端发送的数据格式,另一个表示客户端接受的数据格式为了避免造成数据丢失,需让 character_set_connection的字符编码 大于 character_set_client的字符编码.(MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;)
二)对于Mysql旧版本的默认latin情况,里面尽管传入了UTF8,也能正常的显示和插入(character_set_client| latin1(中文你utf8是3个字节,也就是来自前端网页的UTF8的你字,而latin1是按照单个字节解析的,虽然进行了转换,但不会导致二进制内容的变化,但实际上mysql客户端认为我输入了3个latin1字符;还好是UTF8前端,如果客户端是GBK,直接收到一个3字节的UTF8的编码会为是1个gbk字符和一个西欧字符) -> character_set_connection | latin1->),但本质上是以UTF8的方式存入磁盘时是6个字符( character_set_database | utf8 ),而出来时又被Latin1转回为3个字符后被UTF8看成1个汉字也就是你字,而如果这个Lation1不这样6字节变3字节,也就是(character_set_results 的值由latin1变UTF8后)UTF8后,则6个字符以UTF8直接穿透到显示层了,会在SecureCRT(设置UTF8输出显示)看到UTF8是6个字符认为是两个汉字,也就成了我们认为的乱码!!!归结于:由于latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。
实践如下,实践证明输出与character_set_results的编码有关,当set character_set_results是latin1时会转为输入时的UTF8的三个字符,而set character_set_results="utf8"时,则它输出了存入Mysqld数据库的6个字节的UTF8直接输出,前端认为是两个字也就显示出来了东,也就是把C3A4C2B8C593以SecureCRT配置的前端输出经过UTF8解码显示,就是乱码了。
这个在Mysql里可通过设置set names latin1;并且secureCRT的Character encoding设置为utf8就能正常显示,本质上:
mysql> select c ,hex(c) from t;
+--------+--------------+
| c | hex(c) |
+--------+--------------+
| 东 (这里面的输出是将 hex(c)里的内容C3A4C2B8C593 经过character_set_results=latin1编码后显示,这个显示正常不正常是由SecureCRT的输出时是GB2312,还是UTF8,这儿输出本来是latin1,但是被SecureCRT按utf8显示后就是 三个字节的东字!!! ) | C3A4C2B8C593 |
+--------+--------------+
核心内容:输出的那个Lation1变UTF8(set character_set_results=utf8)后,反而乱码的原因是如下:
From:https://edu.aliyun.com/a/15790
基础学习:关于前面提到的字节和位的一个关系的一个基础知识:位:"位(bit)"是电子计算机中最小的数据单位。每一位的状态只能是0或1。字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。即1个字节等于8个比特(1Byte=8bit)。八位二进制数最小为00000000,最大为11111111(0XFF,全是1,也就是两个F(十进制是255 ),C3的对应的十进制195,A4对应十进制是164);通常1个字节可以存入一个ASCII码,“c3a4 c2bd c2a0”(6个字节) ,ASCII码用十六进制表示的,C3、a4等等,http://ascii.911cha.com/。
三)对于2的这种情况是在升级时可全部改为UTF8的编码的,是可以根据 mysqldump 时加上 --default-character-set=latin1,导出正常的Utf8编码的中文且显示正常的字符,但是加了这 个后,记得修改里面的set names latin1,为set names utf8, 而在程序代码里连接时也加上set names utf8,黄冶是default-character-set=utf8就能正常显示。(mysqldump -h 127.0.0.1 -P 3306 -u username --default-character-set=latin1 -p databasename > dumpfile.txt)
=========================================================================================
[转]深入Mysql字符集设置,比阿里巴巴技术团队的更形像,有图:
https://blog.csdn.net/haiross/article/details/51273630 (请道因为UTF8插入时如果存的是比它小的,可能转时出现问题,而没法恢复,因为存入时就坏了:插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有/u0000~/u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。而以latin1入到Utf8后,会导致字符数变多,也就是存储空间会因为中文的UTF8是3个及以上(文章里提到的3个字节变成6个字节),占用了更多磁盘,插入操作的数据将经过latin1(character_set_client)=>latin1(character_set_connection)=>utf8(character_set_results)的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存; )
阿里云大学谈到了其乱码的本质一样的用你的UTF8作描述的文字版:https://edu.aliyun.com/a/15790
MySQL的几个character_set变量的说明:https://www.linuxidc.com/Linux/2017-04/143263.htm
MySQL抓包工具:MySQL Sniffer【转】:
https://www.cnblogs.com/zhoujinyi/p/6497231.html
利用tcpdump对mysql进行抓包操作技巧_Mysql:
https://edu.aliyun.com/a/15214
特殊变量之character_set_system:character_set_system是个只读数据不能更改。也没多少改的意义,他是元数据的编码,相信不会有人用中文做数据库名和字段名之类的吧,这个字段和具体存储的数据无关。
mysql> show variables like '%char%';
+--------------------------+-----------------------------------------------------+
| Variable_name | 说明 |
+--------------------------+-----------------------------------------------------+
| character_set_client | 客户端字符集 |
| character_set_connection | 当前连接字符集 |
| character_set_database | 数据库字符集 |
| character_set_filesystem | 文件系统字符集,不要修改,使用binary即可 |
| character_set_results | 返回结果集字符集 |
| character_set_server | 服务器默认字符集,当数据库、表、列没有设置时,如Show create table里的中文表字段批注 |
| | 默认使用此字符集 |
| character_set_system | 固定为utf8 |
+--------------------------+-----------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
------------------------而latin1是按照单个字节解析的,虽然进行了转换,但不会导致二进制内容的变化!-------------------------------------------
这里首先需要解释的是,我想应该就是连接通道的含义了。那什么是连接通道呢?
背景:这种理解其实是早期程序员以PHP为例通常觉得数据存为简体中文比教少占空间,utf8中文占用大于等于三,由unicode字符集决定的,其实现在看来用utf8都不是啥大事,磁盘很便宜。再就是早期mysql默认就是拉丁字符集合。
导致出现想转为utf8的,首先导出时候得指定字符集为拉丁,假如不加指定以拉丁导出其默认是utf8,往往那个建表结构的comment注释是utf8,出现评论正常,数据库内容中文乱码,用file xxx.sql检查的确是一个utf8的sql文件。
如果MySQL服务器上的字符集是 latin1 的,mysqldump 出来的中文都是乱码!一个简单的办法是加上默认字符集选项,如:
mysqldump -h 127.0.0.1 -P 3306 -u username --default-character-set=latin1 -p databasename > dumpfile.txt #character_set_connection、character_set_client、character_set_results三个字符集一次性被设置为latin1了。character_set_client、character_set_connection、character_set_results这3个参数值是由客户端每次连接进来设置的,和服务器端没关系。我们登陆进mysql后,执行 set names utf8; 实际就是同时修改上面的这3个参数值的。From:MySQL的几个character_set变量的说明,https://www.linuxidc.com/Linux/2017-04/143263.htm。
有些网站在开发时,并没有正确指定编码,採用了预设的 latin1 ,并且将 big5 的中文资料直接储存。这种情况如果直接用 mysqldump 直接匯出,结果可能是一堆乱码,必须加上 --default-character-set=latin1 让匯出的资料保持正常的 big5 编码。
mysqldump -u USER -p DBNAME --default-character-set=latin1 > DBNAME.sql
如果在匯出备份资料时,忘记加上参数,產生的乱码资料,用 iconv 可以救回部分(以下指令示范假设匯出档為错误编码的utf8),参数 "-c" 表示忽略无法转码的字元。
iconv -c -f utf8 -t latin1 DBNAME.sql > DBNAME.big5.sql
对于 big5 编码的匯出档,也可以用 iconv 转换成 utf8 格式。
iconv -c -f big5 -t utf8 DBNAME.sql > DBNAME.utf8.sql
再进行编码格式设定的替换。
perl -pi -e 's/big5/utf8/g' DBNAME.utf8.sql
旧的Mysql默认选项:
mysql> show variables like "%set%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
从源码编译mysql的时候,通过编译参数进行设置
编译的时候如果指定了-DDEFAULT_CHARSET和-DDEFAULT_COLLATION,那么:
创建database、table时,会将其作为默认的字符集/字符序。
client连接server时,会将其作为默认的字符集/字符序。(不用单独SET NAMES)
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
RPM打包:
cmake . \
...
-DDEFAULT_CHARSET=utf8 \
...
make %{?_smp_mflags}
=============================================================================
搞成utf8的编码,怎么办?分三步:
1)mysqldump default-character-set=latin databse table > /tmp/utf8format.sql #本质上是存在数据库里面的编码就是latin,指定以Latin字符编码给导出到一个utf8文件里面。
2)在导出文件里面因为1加入了指定导出编码了,于是文件里面sql语句有一个set names latin,把这个改成set names utf8。此时用less看无论建表结构的评论注释还是表里内容均显示正常,中文不乱码。
3)在导入数据的mysqlserver的my.cnf设置尽可能全utf8,如果不设置因为2在sql文件建立表和插入数据前加入设置编码了,直接mysql导入即可。保证全是utf8后,PHP的连接字符串编码也是UTF8即可。
所谓连接通道,就是客户端和服务器端保持连接的一个通道,它是逻辑上的一个概念。客户端通过连接通道发送sql语句到服务器端,服务端执行,将结果再通过连接通道返回至客户端。the connection is the pass when you connect to the server.
这个过程中,有几个临界点(逻辑上概念),是我们需要注意的,mysql也就在这几个临界点上做了文章。
1、当语句离开客户端的时候:
从客户端出来的,包括sql语句本身(这里里面就包含字符串和关键字等了),以及character_set_client系统变量。为什么要包含这个变量呢?这个变量的作用说明2点,也是它的作用:一是表示该语句中的字符集是使用character_set_client指定的字符集编码的,二是通过此系统变量来告诉服务器所发送来的语句中的字符集编码。
2、当服务器端接受到客户端的语句的时候:
mysql会使用character_set_connection/collation_connection指定的字符集以及校验规则,将客户端的字符串,做一个从character_set_client到character_set_connection的转换。
3、当服务器处理好结果以后,在把结果传给客户端前:
mysql会先将结果转换成character_set_results指定的字符集,然后传回给客户端。
当字符串在mysql服务器的时候,最终以什么格式存储到mysql数据库中,这个是受到具体的数据表级别、列级别字符集设置的控制了。
阅读全文
最后谈严格模式:Mysql尽可能采用严格模式,一定程序上防止一些编码问题和长度问题(https://blog.csdn.net/fdipzone/article/details/50616247)。
set global sql_mode=''; #这种方法修改,当前会话失效后,这个修改就没意义了,建议修改配置文件的方式修改,修改后,不需要重启mysql服务,立即生效,检查是否生效,执行sql ,select @@sql_mode;
show create table t;
CREATE TABLE `t` (
`c` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
show variables like "%char%";
set names gbk;
mysql> select c ,hex(c) from t;
+------+--------+
| c | hex(c) |
+------+--------+
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
| 东 | E4B89C |
+------+--------+
8 rows in set (0.00 sec)
php igbk.php
string(4) "b6ab"
int(1)
string(4) "b6ab"
string(4) "b6ab"
Array
(
[0] => Array
(
[c] => 东
[0] => 东
[hex] => E4B89C
[1] => E4B89C
)
说明三个问题:
1)咱们在显示一个字符时,在SecureCRT里配置的character encoding只是显示,并不像Mysql的set names utf8里的三个参数(character_set_client character_set_connection character_set_results )有由一个字符转向另一个字符集的功效,要想显示正常,则只需要对转出来的结果进行匹配即可显示正常。bin2hex("东")
三条:
一)如果character_set_client和character_set_results 一般情况下要一致,因为一个表示客户端发送的数据格式,另一个表示客户端接受的数据格式为了避免造成数据丢失,需让 character_set_connection的字符编码 大于 character_set_client的字符编码.(MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;)
二)对于Mysql旧版本的默认latin情况,里面尽管传入了UTF8,也能正常的显示和插入(character_set_client| latin1(中文你utf8是3个字节,也就是来自前端网页的UTF8的你字,而latin1是按照单个字节解析的,虽然进行了转换,但不会导致二进制内容的变化,但实际上mysql客户端认为我输入了3个latin1字符;还好是UTF8前端,如果客户端是GBK,直接收到一个3字节的UTF8的编码会为是1个gbk字符和一个西欧字符) -> character_set_connection | latin1->),但本质上是以UTF8的方式存入磁盘时是6个字符( character_set_database | utf8 ),而出来时又被Latin1转回为3个字符后被UTF8看成1个汉字也就是你字,而如果这个Lation1不这样6字节变3字节,也就是(character_set_results 的值由latin1变UTF8后)UTF8后,则6个字符以UTF8直接穿透到显示层了,会在SecureCRT(设置UTF8输出显示)看到UTF8是6个字符认为是两个汉字,也就成了我们认为的乱码!!!归结于:由于latin1 是一种非常宽松的编码方式,任何一种编码方式得到的文本,用 latin1 进行解码,都不会发生解码失败——当然,解码得到的结果自然也就是理所当然的“乱码”。
实践如下,实践证明输出与character_set_results的编码有关,当set character_set_results是latin1时会转为输入时的UTF8的三个字符,而set character_set_results="utf8"时,则它输出了存入Mysqld数据库的6个字节的UTF8直接输出,前端认为是两个字也就显示出来了东,也就是把C3A4C2B8C593以SecureCRT配置的前端输出经过UTF8解码显示,就是乱码了。
这个在Mysql里可通过设置set names latin1;并且secureCRT的Character encoding设置为utf8就能正常显示,本质上:
mysql> select c ,hex(c) from t;
+--------+--------------+
| c | hex(c) |
+--------+--------------+
| 东 (这里面的输出是将 hex(c)里的内容C3A4C2B8C593 经过character_set_results=latin1编码后显示,这个显示正常不正常是由SecureCRT的输出时是GB2312,还是UTF8,这儿输出本来是latin1,但是被SecureCRT按utf8显示后就是 三个字节的东字!!! ) | C3A4C2B8C593 |
+--------+--------------+
核心内容:输出的那个Lation1变UTF8(set character_set_results=utf8)后,反而乱码的原因是如下:
From:https://edu.aliyun.com/a/15790
基础学习:关于前面提到的字节和位的一个关系的一个基础知识:位:"位(bit)"是电子计算机中最小的数据单位。每一位的状态只能是0或1。字节:8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间。即1个字节等于8个比特(1Byte=8bit)。八位二进制数最小为00000000,最大为11111111(0XFF,全是1,也就是两个F(十进制是255 ),C3的对应的十进制195,A4对应十进制是164);通常1个字节可以存入一个ASCII码,“c3a4 c2bd c2a0”(6个字节) ,ASCII码用十六进制表示的,C3、a4等等,http://ascii.911cha.com/。
三)对于2的这种情况是在升级时可全部改为UTF8的编码的,是可以根据 mysqldump 时加上 --default-character-set=latin1,导出正常的Utf8编码的中文且显示正常的字符,但是加了这 个后,记得修改里面的set names latin1,为set names utf8, 而在程序代码里连接时也加上set names utf8,黄冶是default-character-set=utf8就能正常显示。(mysqldump -h 127.0.0.1 -P 3306 -u username --default-character-set=latin1 -p databasename > dumpfile.txt)
=========================================================================================
[转]深入Mysql字符集设置,比阿里巴巴技术团队的更形像,有图:
https://blog.csdn.net/haiross/article/details/51273630 (请道因为UTF8插入时如果存的是比它小的,可能转时出现问题,而没法恢复,因为存入时就坏了:插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有/u0000~/u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0x3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。而以latin1入到Utf8后,会导致字符数变多,也就是存储空间会因为中文的UTF8是3个及以上(文章里提到的3个字节变成6个字节),占用了更多磁盘,插入操作的数据将经过latin1(character_set_client)=>latin1(character_set_connection)=>utf8(character_set_results)的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存; )
阿里云大学谈到了其乱码的本质一样的用你的UTF8作描述的文字版:https://edu.aliyun.com/a/15790
MySQL的几个character_set变量的说明:https://www.linuxidc.com/Linux/2017-04/143263.htm
MySQL抓包工具:MySQL Sniffer【转】:
https://www.cnblogs.com/zhoujinyi/p/6497231.html
利用tcpdump对mysql进行抓包操作技巧_Mysql:
https://edu.aliyun.com/a/15214
特殊变量之character_set_system:character_set_system是个只读数据不能更改。也没多少改的意义,他是元数据的编码,相信不会有人用中文做数据库名和字段名之类的吧,这个字段和具体存储的数据无关。
mysql> show variables like '%char%';
+--------------------------+-----------------------------------------------------+
| Variable_name | 说明 |
+--------------------------+-----------------------------------------------------+
| character_set_client | 客户端字符集 |
| character_set_connection | 当前连接字符集 |
| character_set_database | 数据库字符集 |
| character_set_filesystem | 文件系统字符集,不要修改,使用binary即可 |
| character_set_results | 返回结果集字符集 |
| character_set_server | 服务器默认字符集,当数据库、表、列没有设置时,如Show create table里的中文表字段批注 |
| | 默认使用此字符集 |
| character_set_system | 固定为utf8 |
+--------------------------+-----------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
------------------------而latin1是按照单个字节解析的,虽然进行了转换,但不会导致二进制内容的变化!-------------------------------------------
这里首先需要解释的是,我想应该就是连接通道的含义了。那什么是连接通道呢?
背景:这种理解其实是早期程序员以PHP为例通常觉得数据存为简体中文比教少占空间,utf8中文占用大于等于三,由unicode字符集决定的,其实现在看来用utf8都不是啥大事,磁盘很便宜。再就是早期mysql默认就是拉丁字符集合。
导致出现想转为utf8的,首先导出时候得指定字符集为拉丁,假如不加指定以拉丁导出其默认是utf8,往往那个建表结构的comment注释是utf8,出现评论正常,数据库内容中文乱码,用file xxx.sql检查的确是一个utf8的sql文件。
如果MySQL服务器上的字符集是 latin1 的,mysqldump 出来的中文都是乱码!一个简单的办法是加上默认字符集选项,如:
mysqldump -h 127.0.0.1 -P 3306 -u username --default-character-set=latin1 -p databasename > dumpfile.txt #character_set_connection、character_set_client、character_set_results三个字符集一次性被设置为latin1了。character_set_client、character_set_connection、character_set_results这3个参数值是由客户端每次连接进来设置的,和服务器端没关系。我们登陆进mysql后,执行 set names utf8; 实际就是同时修改上面的这3个参数值的。From:MySQL的几个character_set变量的说明,https://www.linuxidc.com/Linux/2017-04/143263.htm。
有些网站在开发时,并没有正确指定编码,採用了预设的 latin1 ,并且将 big5 的中文资料直接储存。这种情况如果直接用 mysqldump 直接匯出,结果可能是一堆乱码,必须加上 --default-character-set=latin1 让匯出的资料保持正常的 big5 编码。
mysqldump -u USER -p DBNAME --default-character-set=latin1 > DBNAME.sql
如果在匯出备份资料时,忘记加上参数,產生的乱码资料,用 iconv 可以救回部分(以下指令示范假设匯出档為错误编码的utf8),参数 "-c" 表示忽略无法转码的字元。
iconv -c -f utf8 -t latin1 DBNAME.sql > DBNAME.big5.sql
对于 big5 编码的匯出档,也可以用 iconv 转换成 utf8 格式。
iconv -c -f big5 -t utf8 DBNAME.sql > DBNAME.utf8.sql
再进行编码格式设定的替换。
perl -pi -e 's/big5/utf8/g' DBNAME.utf8.sql
旧的Mysql默认选项:
mysql> show variables like "%set%";
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
从源码编译mysql的时候,通过编译参数进行设置
编译的时候如果指定了-DDEFAULT_CHARSET和-DDEFAULT_COLLATION,那么:
创建database、table时,会将其作为默认的字符集/字符序。
client连接server时,会将其作为默认的字符集/字符序。(不用单独SET NAMES)
shell> cmake . -DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
RPM打包:
cmake . \
...
-DDEFAULT_CHARSET=utf8 \
...
make %{?_smp_mflags}
=============================================================================
搞成utf8的编码,怎么办?分三步:
1)mysqldump default-character-set=latin databse table > /tmp/utf8format.sql #本质上是存在数据库里面的编码就是latin,指定以Latin字符编码给导出到一个utf8文件里面。
2)在导出文件里面因为1加入了指定导出编码了,于是文件里面sql语句有一个set names latin,把这个改成set names utf8。此时用less看无论建表结构的评论注释还是表里内容均显示正常,中文不乱码。
3)在导入数据的mysqlserver的my.cnf设置尽可能全utf8,如果不设置因为2在sql文件建立表和插入数据前加入设置编码了,直接mysql导入即可。保证全是utf8后,PHP的连接字符串编码也是UTF8即可。
所谓连接通道,就是客户端和服务器端保持连接的一个通道,它是逻辑上的一个概念。客户端通过连接通道发送sql语句到服务器端,服务端执行,将结果再通过连接通道返回至客户端。the connection is the pass when you connect to the server.
这个过程中,有几个临界点(逻辑上概念),是我们需要注意的,mysql也就在这几个临界点上做了文章。
1、当语句离开客户端的时候:
从客户端出来的,包括sql语句本身(这里里面就包含字符串和关键字等了),以及character_set_client系统变量。为什么要包含这个变量呢?这个变量的作用说明2点,也是它的作用:一是表示该语句中的字符集是使用character_set_client指定的字符集编码的,二是通过此系统变量来告诉服务器所发送来的语句中的字符集编码。
2、当服务器端接受到客户端的语句的时候:
mysql会使用character_set_connection/collation_connection指定的字符集以及校验规则,将客户端的字符串,做一个从character_set_client到character_set_connection的转换。
3、当服务器处理好结果以后,在把结果传给客户端前:
mysql会先将结果转换成character_set_results指定的字符集,然后传回给客户端。
当字符串在mysql服务器的时候,最终以什么格式存储到mysql数据库中,这个是受到具体的数据表级别、列级别字符集设置的控制了。

1. 安装Apahce, PHP, Mysql, 以及php连接mysql库组件。
yum -y install httpd php mysql mysql-server php-mysql
2. 配置开机启动服务
/sbin/chkconfig httpd on [设置apache服务器httpd服务开机启动]
/sbin/chkconfig --add mysqld [在服务清单中添加mysql服务]
/sbin/chkconfig mysqld on [设置mysql服务开机启动]
/sbin/service httpd start [启动httpd服务,与开机启动无关]
/sbin/service mysqld start [启动mysql服务,与开机无关]
3.设置mysql数据库root帐号密码。
mysqladmin -u root password 'newpassword' [引号内填密码]
4. 让mysql数据库更安全
mysql -u root -p [此时会要求你输入刚刚设置的密码,输入后回车即可]
mysql> DROP DATABASE test; [删除test数据库]
mysql> DELETE FROM mysql.user WHERE user = ''; [删除匿名帐户]
mysql> FLUSH PRIVILEGES; [重载权限]
5. 按照以上的安装方式, 配置出来的默认站点目录为/var/www/html/新建一个php脚本:
phpinfo();
?>
6. 新建一个数据库,添加一个数据库用户,设置用户权限。写个php脚本测试一下数据库连接吧。
mysql> CREATE DATABASE my_db;
mysql> GRANT ALL PRIVILEGES ON my_db.* TO 'user'@'localhost' IDENTIFIED BY 'password';
//安装apache扩展
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
//安装php的扩展
yum install php-gd
yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc
//安装mysql扩展
yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql
yum -y install httpd php mysql mysql-server php-mysql
2. 配置开机启动服务
/sbin/chkconfig httpd on [设置apache服务器httpd服务开机启动]
/sbin/chkconfig --add mysqld [在服务清单中添加mysql服务]
/sbin/chkconfig mysqld on [设置mysql服务开机启动]
/sbin/service httpd start [启动httpd服务,与开机启动无关]
/sbin/service mysqld start [启动mysql服务,与开机无关]
3.设置mysql数据库root帐号密码。
mysqladmin -u root password 'newpassword' [引号内填密码]
4. 让mysql数据库更安全
mysql -u root -p [此时会要求你输入刚刚设置的密码,输入后回车即可]
mysql> DROP DATABASE test; [删除test数据库]
mysql> DELETE FROM mysql.user WHERE user = ''; [删除匿名帐户]
mysql> FLUSH PRIVILEGES; [重载权限]
5. 按照以上的安装方式, 配置出来的默认站点目录为/var/www/html/新建一个php脚本:
phpinfo();
?>
6. 新建一个数据库,添加一个数据库用户,设置用户权限。写个php脚本测试一下数据库连接吧。
mysql> CREATE DATABASE my_db;
mysql> GRANT ALL PRIVILEGES ON my_db.* TO 'user'@'localhost' IDENTIFIED BY 'password';
//安装apache扩展
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql
//安装php的扩展
yum install php-gd
yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc
//安装mysql扩展
yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql
MySQL 大企业级应用可行性分析
http://www.dbanotes.net/database/mysql_comment.html
http://www.dbanotes.net/database/mysql_comment_2.html
http://www.dbanotes.net/database/mysql_comment_3.html
http://www.dbanotes.net/database/mysql_comment.html
http://www.dbanotes.net/database/mysql_comment_2.html
http://www.dbanotes.net/database/mysql_comment_3.html
http://syre.blogbus.com/logs/23587704.html
一个mysql命令行客户端的一个小技巧
在mysql命令行客户端操作的时候,有时候一个语句的结果一长~~~~串,然后就没得看了,还会把之前的东西全冲掉。
mysql的命令行客户端有这么一个功能,可以选择查询结果的page方式。比如用\P less,就会用less来显示查询结果,就可以上下滚动翻页了。同样的,也可以用more或者其他什么东西,甚至可以用自己的脚本来做一些处理。如果想换回标准的,直接\P就可以了。\P是page的简写,所以喜欢更清晰的也可以用page。
另一个技巧知道的人多一些
在语句最后用\G代替;就会让查询结果垂直输出,对于有很多列的结果比如explain,会清晰一些。
一个mysql命令行客户端的一个小技巧
在mysql命令行客户端操作的时候,有时候一个语句的结果一长~~~~串,然后就没得看了,还会把之前的东西全冲掉。
mysql的命令行客户端有这么一个功能,可以选择查询结果的page方式。比如用\P less,就会用less来显示查询结果,就可以上下滚动翻页了。同样的,也可以用more或者其他什么东西,甚至可以用自己的脚本来做一些处理。如果想换回标准的,直接\P就可以了。\P是page的简写,所以喜欢更清晰的也可以用page。
另一个技巧知道的人多一些
在语句最后用\G代替;就会让查询结果垂直输出,对于有很多列的结果比如explain,会清晰一些。