0%

众所周知,目前的mysql版本中并不支持直接的递归查询,但是通过递归到迭代转化的思路,还是可以在一句SQL内实现树的递归查询的。这个得益于Mysql允许在SQL语句内使用@变量。以下是示例代码。

创建表格

1
2
3
4
5
CREATE TABLE `treenodes` (
`id` int , -- 节点ID
`nodename` varchar (60), -- 节点名称
`pid` int -- 节点父ID
);

插入测试数据

1
2
3
4
5
6
7
8
INSERT INTO `treenodes` (`id`, `nodename`, `pid`) VALUES
('1','A','0'),('2','B','1'),('3','C','1'),
('4','D','2'),('5','E','2'),('6','F','3'),
('7','G','6'),('8','H','0'),('9','I','8'),
('10','J','8'),('11','K','8'),('12','L','9'),
('13','M','9'),('14','N','12'),('15','O','12'),
('16','P','15'),('17','Q','15'),('18','R','3'),
('19','S','2'),('20','T','6'),('21','U','8');

查询语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 SELECT id AS ID,pid AS 父ID ,levels AS 父到子之间级数, paths AS 父到子路径 FROM (
SELECT id,pid,
@le:= IF (pid = 0 ,0,
IF( LOCATE( CONCAT('|',pid,':'),@pathlevel) > 0 ,
SUBSTRING_INDEX( SUBSTRING_INDEX(@pathlevel,CONCAT('|',pid,':'),-1),'|',1) +1
,@le+1) ) levels
, @pathlevel:= CONCAT(@pathlevel,'|',id,':', @le ,'|') pathlevel
, @pathnodes:= IF( pid =0,',0',
CONCAT_WS(',',
IF( LOCATE( CONCAT('|',pid,':'),@pathall) > 0 ,
SUBSTRING_INDEX( SUBSTRING_INDEX(@pathall,CONCAT('|',pid,':'),-1),'|',1)
,@pathnodes ) ,pid ) )paths
,@pathall:=CONCAT(@pathall,'|',id,':', @pathnodes ,'|') pathall
FROM treenodes,
(SELECT @le:=0,@pathlevel:='', @pathall:='',@pathnodes:='') vv
ORDER BY pid,id
) src
ORDER BY id;

最后的结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
    ID   父ID  父到子之间级数  父到子路径
------ ------ ------------ ---------------
1 0 0 ,0
2 1 1 ,0,1
3 1 1 ,0,1
4 2 2 ,0,1,2
5 2 2 ,0,1,2
6 3 2 ,0,1,3
7 6 3 ,0,1,3,6
8 0 0 ,0
9 8 1 ,0,8
10 8 1 ,0,8
11 8 1 ,0,8
12 9 2 ,0,8,9
13 9 2 ,0,8,9
14 12 3 ,0,8,9,12
15 12 3 ,0,8,9,12
16 15 4 ,0,8,9,12,15
17 15 4 ,0,8,9,12,15
18 3 2 ,0,1,3
19 2 2 ,0,1,2
20 6 3 ,0,1,3,6
21 8 1 ,0,8

via. http://www.cnblogs.com/dukou/p/4691543.html

无法打开新数据库 ‘Dong’。CREATE DATABASE 中止。
文件激活失败。物理文件名称’E:\SqlServer\MSSQL\Data\Dong_log.LDF’可能不正确。

无法重新生成日志,原因是数据库关闭时存在打开的事务/用户,该数据库没有检查点或者该数据库是只读的。如果事务日志文件被手动删除或者由于硬件或环境问题而丢失,则可能出现此错误。 (Microsoft SQL Server,错误: 1813)

解决方案:

  1. 新建一个同名数据库。

  2. 停止数据库服务,覆盖新建的数据库主文件(小技巧:最好放在同一个磁盘里面,把新建的数据库主文件删掉或移开,再把要恢复的数据库主文件剪切过去,这样就可以节省时间。)

  3. 启动数据库服务,数据库变为置疑或可疑状态。然后在查询分析器中运行:

    1
    alter database 无日志文件的数据库名称 set emergency

    设置为紧急状态。

  4. 再运行:

    1
    alter database 无日志文件的数据库名称 set single_user

    或者:

    1
    Sp_dboption '无日志文件的数据库名称', 'single user', 'true'

    设置为单用户模式。

  5. 检查并重建日志文件,运行:

    1
    dbcc checkdb('无日志文件的数据库名称',REPAIR_ALLOW_DATA_LOSS)

    这个时间比较长。耐心等待!如果有错误提示,再运行:

    1
    dbcc checkdb('无日志文件的数据库名称',REPAIR_REBUILD)

    进行修复。如果没有错误,可以跳过。

  6. 恢复成多用户模式

    1
    alter database 无日志文件的数据库名称 set multi_user

    或者:

    1
    Sp_dboption '无日志文件的数据库名称', 'single user', 'false'

    刷新数据库,你就可以看到已经修复好的数据库了。

via. http://www.cnblogs.com/lyl6796910/p/3628066.html

关于UTF-8

UTF-8 Unicode Transformation Format-8bit。是用以解决国际上字符的一种多字节编码。

它对英文使用8位(即一个字节) ,中文使用24位(三个字节)来编码。
UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。

UTF-8编码的文字可以在各国支持UTF8字符集额的浏览器上显示。 如果是UTF8编码,则在外国人的英文IE也能显示中文,他们无需下载IE的中文语言支持包。

关于GBK

GBK 是国家标准GB2312基础上扩容后兼容GB2312的标准。
GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。
GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大。

关于utf8mb4

MySql 5.5 之前,UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区,BMP是从哪到哪? [戳这里] (http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters)基本就是 0000 ~ FFFF 这一区。

从MySQL 5.5 开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。

utf8mb4 is a superset of utf8

tf8mb4兼容utf8,且比utf8能表示更多的字符。
至于什么时候用,看你做的什么项目了。。。 在做移动应用时,会遇到IOS用户在文本的区域输入emoji表情,如果不做一定处理,就会导致插入数据库异常。

汉字长度与编码有关

MySql 5.0 以上的版本:

  1. 一个汉字占多少长度与编码有关:
编码 一个汉字 一个英文
UTF-8 3字节 1字节
GBK 2字节 1字节
  1. varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入 n 个字符,仅实际字节长度有所区别。

  2. MySQL检查长度,可用SQL语言

    1
    SELECT LENGTH(fieldname) FROM tablename

实际测试

首先使用utf8

创建 str_test 表。

1
2
3
4
CREATE TABLE `str_test` (
`name_chn` varchar(20) NOT NULL,
`name_en` varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

然后插入值

1
2
mysql> insert into  str_test values ('我爱Ruby', 'I Love Ruby!');
Query OK, 1 row affected (0.02 sec)

打开irb

1
2
3
4
5
>> "我爱Ruby".size
=> 6
>> "I Love Ruby!".size
=> 12
>>

从MySQL中查询出来的结果,对比

1
2
3
4
5
6
7
mysql> select * from str_test;
+------------+--------------+
| name_chn | name_en |
+------------+--------------+
| 我爱Ruby | I Love Ruby! |
+------------+--------------+
1 row in set (0.02 sec)

UTF-8 中文是三个字节,英文是一个字节。

1
2
3
4
5
6
7
mysql> select length(name_chn) from str_test;
+------------------+
| length(name_chn) |
+------------------+
| 10 |
+------------------+
1 row in set (0.01 sec)

3[一个汉字三字节] * 2 + 1[一个英文一字节] * 4 = 10

1
2
3
4
5
6
7
mysql> select length(name_en) from str_test;
+-----------------+
| length(name_en) |
+-----------------+
| 12 |
+-----------------+
1 row in set (0.00 sec)

1[一个英文一字节] * 10 + 1[空格一字节] * 2 = 12

使用 GBK 做测试

创建表

1
2
3
4
CREATE TABLE `str_test` (
`name_chn` varchar(20) NOT NULL,
`name_en` varchar(20) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=62974 DEFAULT CHARSET=gbk

插入数据,并且测试

1
2
mysql> insert into  str_test values ('我爱Ruby', 'I Love Ruby!');
Query OK, 1 row affected (0.00 sec)
1
2
3
4
5
6
7
mysql> select * from str_test;
+------------+--------------+
| name_chn | name_en |
+------------+--------------+
| 我爱Ruby | I Love Ruby! |
+------------+--------------+
1 row in set (0.01 sec)

GBK 中文是两个字节,英文是一个字节。

1
2
3
4
5
6
7
mysql> select length(name_chn) from str_test;
+------------------+
| length(name_chn) |
+------------------+
| 8 |
+------------------+
1 row in set (0.00 sec)

2[中文两个字节] * 2 + 1[英文一个字节] * 4 = 8

1
2
3
4
5
6
7
mysql> select length(name_en) from str_test;
+-----------------+
| length(name_en) |
+-----------------+
| 12 |
+-----------------+
1 row in set (0.00 sec)

1[英文一个字节] * 10 + 1[空格一个字节] * 2 = 12

关于varchar 最多能存多少值

mysql的记录行长度是有限制的,不是无限长的,这个长度是64K,即65535个字节,对所有的表都是一样的。
MySQL对于变长类型的字段会有1-2个字节来保存字符长度。
当字符数小于等于255时,MySQL只用1个字节来记录,因为2的8次方减1只能存到255。
当字符数多余255时,就得用2个字节来存长度了。
在utf-8状态下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。
在gbk状态下的varchar, 最大只能到 (65535 - 2) / 2 = 32766 余 1

使用 utf-8 创建

1
2
3
4
5
mysql> CREATE TABLE `str_test` (
-> `id` tinyint(1) NOT NULL,
-> `name_chn` varchar(21845) NOT NULL
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

使用gbk创建

1
2
3
4
5
mysql>     CREATE TABLE `str_test` (
-> `id` tinyint(1) NOT NULL,
-> `name_chn` varchar(21844) NOT NULL
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.06 sec)

当存储长度为 32768 失败~

1
2
3
4
5
mysql> CREATE TABLE `str_test` (
-> `id` tinyint(1) NOT NULL,
-> `name_chn` varchar(32768) NOT NULL
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;
ERROR 1074 (42000): Column length too big for column 'name_chn' (max = 32767); use BLOB or TEXT instead

当存储长度为 32767 失败~

1
2
3
4
5
mysql> CREATE TABLE `str_test`(
-> `id` tinyint(1) NOT NULL,
-> `name_chn` varchar(32767) NOT NULL
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

当存储长度为 32766 成功~

1
2
3
4
5
mysql> CREATE TABLE `str_test` (
-> `id` tinyint(1) NOT NULL,
-> `name_chn` varchar(32766) NOT NULL
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;
Query OK, 0 rows affected (0.03 sec)

smallint 用两个字节存储,所以

2[smallint] + 32766 * 2[varchar GBK存储长度] + 2[2个字节来存长度] > 65535

所以失败~

1
2
3
4
5
mysql> CREATE TABLE `str_test` (
-> `id` smallint(1) NOT NULL,
-> `name_chn` varchar(32766) NOT NULL
-> ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=gbk;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

数值类型所占的字节

类型 所占字节
int 4 字节
smallint 2 字节
tinyint 1 字节
decimal 变长

官方关于decimal 的描述如下:

Values for DECIMAL (and NUMERIC) columns are represented using a binary format that packs nine decimal (base 10) digits into four bytes.
Storage for the integer and fractional parts of each value are determined separately.
Each multiple of nine digits requires four bytes, and the “leftover” digits require some fraction of four bytes.
The storage required for excess digits is given by the following table.

翻译为中文

使用二进制格式将9个十进制(基于10)数压缩为4个字节来表示DECIMAL列值。
每个值的整数和分数部分的存储分别确定。
每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。
下表给出了超出位数的存储需求:

Leftover Digits Number Of Bytes
0 0
1 1
2 1
3 2
4 2
5 3
6 3
7 4
8 4

那:decimal(10,2)占几个字节?

  1. 首先 10 指的是整数与小数部分的总长度, 2指的是小数部分的长度。那么整数部分就只有 10 - 2 = 8 位
  2. 因为整数与小数的存储市各自独立确定的,所以他们各自所占用空间的综合就是所占的总空间了。
  3. 对表可知,整数部分8位占了4个字节,小数部分2位占了1个字节,所以decimal(10,2)总共占了 4 + 1 = 5 个字节。
  4. decimal(6,2) 整数部分(6 - 2 = 4) 位占2字节,小数部分2位占1字节,总共占3字节。

总结

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

在utf-8状态下,汉字最多可以存 21844个字符串, 英文也为 21844个字符串。

在gbk状态下,汉字最多可以存 32766个字符串,英文也为 32766个字符串。

参考

mysql utf8mb4与emoji表情
关于GBK、GB2312、UTF8
阿里云 Rails 项目调整 RDS MySQL 编码为 utf8mb4 的详细步骤
MySQL下varchar类型最大长度是多少

via. https://ruby-china.org/topics/24920

浏览器默认下载器下载百度云的文件速度大多不理想,非客户端下载限速,大文件下载中途失败,让人体验非常不友好。Windows 平台独享百度云管家下载工具,大文件的上下传速度都比较理想,Mac 平台的同步盘功能少,体验差,直到配合下载工具 aria2 下载速度和大文件下载才有所改善。下面是几步简单的教程。

安装

请首先自行安装 Homebrew。Homebrew 安装 aria2

1
brew install aria2

配置

参照以下配置新建 aria2.conf 配置文件,自行设定配置文件路径。

必须要修改的地方有两处:

  1. 下载文件保存路径。用户名填写本机当前用户名。
  2. 最后一行。如果是 SSD 则不用改,如果是传统硬盘,就改成 file-allocation=prealloc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#允许rpc
enable-rpc=true
#允许非外部访问
rpc-listen-all=true
#RPC端口, 仅当默认端口被占用时修改
rpc-listen-port=6800

#最大同时下载数(任务数), 路由建议值: 3
max-concurrent-downloads=10
#断点续传
continue=true
#同服务器连接数
max-connection-per-server=10
#最小文件分片大小, 下载线程数上限取决于能分出多少片, 对于小文件重要
min-split-size=10M
#单文件最大线程数, 路由建议值: 5
split=10
#下载速度限制
max-overall-download-limit=0
#单文件速度限制
max-download-limit=0
#上传速度限制
max-overall-upload-limit=0
#单文件速度限制
max-upload-limit=0

#文件保存路径, 默认为当前启动位置
dir=/Users/用户名/Downloads

#允许所有来源, web界面跨域权限需要
rpc-allow-origin-all=true

#文件预分配, 能有效降低文件碎片, 提高磁盘性能. 缺点是预分配时间较长
#所需时间 none < falloc ? trunc << prealloc, falloc和trunc需要文件系统和内核支持
# !!仅针对传统磁盘,SSD 降低文件碎片并不是什么好事。
file-allocation=none

打开终端,执行以下命令:

1
echo "alias aria2rpc='aria2c --conf-path=/Users/用户名/.../aria2.conf -D'" >> ~/.bash_profile

记得替换你设置的配置文件 aria2.conf 的路径。

最后执行:

1
source ~/.bash_profile

运行

Terminal 执行命名运行 aria2:

1
aria2rpc

每次开机均执行一次即可。

使用
aria2 是一个命令行工具,为了方便,有几种图形界面工具可以配合使用:

  1. 网页 YAAW
    打开网页 Yet Another Aria2 Web Frontend
    点右上角的扳手按钮,修改 JSON-RPC Path 内容为 http://127.0.0.1:6800/jsonrpc

  2. GUI 客户端
    下载 aria2gui
    默认 JSON-RPC 为 http://localhost:6800/jsonrpc,不需要修改。

使用时按 +Add+添加 按钮,输入 HTTP、FTP 或 Magnet 进行下载。

如果嫌每次复制粘贴链接麻烦,浏览器有 百度网盘助手 插件,可以在百度云网页生成 导出下载 按钮,点击 ARIA2 RPC 即可自动在打开的 YAAW 网页或 GUI 客户端上进行下载。

Chrome 插件
Firefox 插件

原文链接:http://www.jianshu.com/p/33b0a9504a04

之前win7系统,使用完全没问题,最近升级了win10,安装后打开,显示的右侧预览页面打不开,提示如图。

官方方案

官方的说法是从 Win 8 开始就有这个问题了,解决办法就是安装 Awesomium 1.6.6 SDK.,如果还是不行就再安装 Microsoft’s DirectX End-User Runtimes (June 2010),经我实际测试,只需要安装前者就可以了。下面是官方的原文:

LivePreview is not working - it displays an error message stating This view has crashed!
This issue has been specifically observed in Windows 8. You may see an error message as shown here, and no HTML will be rendered when you type in the Markdown Editor pane.
To fix this issue, please try installing the Awesomium 1.6.6 SDK.
If you continue to experience issues, please install Microsoft’s DirectX End-User Runtimes (June 2010).

Referer: MarkdownPad - Frequently Asked Questions

If you’re like me, you’ve probably spent countless hours on the web trying to figure out how to install the dev-develop version of Laravel on your machine. As of today, the latest Laravel version 4.2 but if you want to see the awesome Laravel 5 features, you need to upgrade.

In this article, you will learn how to setup Laravel 5 from scratch on OS X.

Requirements

Here are some things you must have:

  • A Terminal
  • XAMPP / MAMP (I will show you how to set it up using both of them)

That’s pretty much it. Let’s get started.

Step 1: Installing Composer

According to their website,

Composer is a tool for dependency management in PHP. It allows you to declare the dependent libraries your project needs and it will install them in your project for you.

In short, it is awesome.

Composer allows you to scaffold out a Laravel project and you also have the flexibility of specifying which version of Laravel your want.

To install composer, run the following commands in the terminal:

1
2
3
curl -sS https://getcomposer.org/installer | php
sudo mkdir -p /usr/local/bin/
sudo mv composer.phar /usr/local/bin/composer
Read more »

重新编译mod_rewrite.so:

查找源码

在apache的源码安装目录中寻找mod_rewrite.c文件

1
2
$ find ./ -name "mod_rewrite.c"
/usr/local/src/httpd-2.2.4/modules/mappers/mod_rewrite.c

编译:

1
2
3
$ cd /usr/local/src/httpd-2.2.4/modules/mappers/
$ /usr/local/apache/bin/apxs -c mod_rewrite.c
$ /usr/local/apache/bin/apxs -i -a -n mod_rewrite mod_rewrite.la

如果没有什么错误的话,应该在你的apache的modules目录中编译出一个mod_rewrite.so文件。
编辑httpd.conf文件,确认httpd.conf中已经包含mod_rewrite.so的加载语句,如下:

1
LoadModule rewrite_module modules/mod_rewrite.so

重启

完成之后,记得重启服务器apache。

可能碰到的问题

错误一

如果出现这个错误

httpd: Syntax error on line 61 of /usr/local/apache/conf/httpd.conf: Can’t locate API module structure `mod_rewrite_module’ in file /usr/local/apache/modules/mod_rewrite.so: /usr/local/apache/modules/mod_rewrite.so: undefined symbol: mod_rewrite_module

修改http.conf
原来:httpd.conf里面写的mod_rewrite_module
改成:rewrite_module

错误二

如果重启apache出现这个错误

httpd: Syntax error on line 61 of /usr/local/apache/conf/httpd.conf: module rewrite_module is built-in and can’t be loaded

表示模块是内建的,不用再调入,修改http.conf注释掉

1
#LoadModule rewrite_module modules/mod_rewrite.so

修改虚拟机配置

注意下一步,配置虚拟主机的时候要类似如下设置才可以生效:

1
2
3
4
5
6
7
8
9
10
11
<VirtualHost *:80>
ServerName www.liudongkai.com
DocumentRoot /home/www.liudongkai.com
ErrorLog logs/www.liudongkai.com-error_log
CustomLog logs/www.liudongkai.com combined
<Directory /home/www.liudongkai.com>
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

如果AllowOverride设置为none的话,apache会不读取网站的.htaccess文件!

1. 数字域的填充:

默认情况下,在显示日期和时间时,date命令使用数字0填充数字域。例如,如果用两位数字显示月份,则6月显示为“06”,如下所示:

1
2
$ date +%m
06

当然,一切皆有变通,你可以用下述控制符来控制填充符号:

短线(-): 表示不填充数字域
下划线(_): 表示用空格填充数字域

Examples:

1
2
3
4
5
6
$ date +%d/%m
14/06
$ date +%-d/%-m
14/6
$ date +%_d/%_m
14/ 6 #注意/和6之间有个空格
Read more »

好消息! Google今天官方宣布,Google Earth Pro以后完全免费了,任何人都可以直接获得。

Google Earth(谷歌地球)是大家非常喜欢的一个好东西(虽然现在基本残废了-_-),但是你知道它还有一个高级的专业版吗?这就是Google Earth Pro,很强大,但也很奢侈,得花大钱购买,而且按年付费,一年就是399美元,约2500元人民币。

与免费版相比,Google Earth Pro支持更多测量工具、更高打印分辨率、更多图层、更强导入功能、录制高清视频。无论规划办公大楼,还是进入深山探险,它都可以轻松胜任。

谷歌地球 Google Earth

注册地址:

https://geoauth.google.com/gev0/free_trial.html

Windows版下载:

http://dl.google.com/earth/client/advanced/current/GoogleEarthProWin.exe

Mac版下载:

http://dl.google.com/earth/client/advanced/current/GoogleEarthProMac.dmg
http://dl.google.com/earth/client/advanced/current/GoogleEarthProMac-Intel.dmg