原创
load data infile 导入数据 InnoDB 外键约束
0用户表:user
主键:id
内容表:post
主键:id
外键:user_id(关联到 user 表的主键 id)
post 表的数据文件存在文本文件中,字段之间用 tab 分隔,当要把文件导入到 post 表时,因 user 和 post 都是 InnoDB 引擎的,有外键约束,运行导入语句:
load data infile '/home/leakon/post.sql' ignore into table post ignore 1 lines ( user_id, title, unixtime );
MySQL 报错,信息如下:
Cannot add or update a child row: a foreign key constraint fails (`leakon/post`, CONSTRAINT `post_FK_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`))
反复尝试,总是失败,后来查了一下解决办法,只要在装载数据之前,插入下述语句,即可暂时关闭外键约束检查:
SET FOREIGN_KEY_CHECKS = 0;
然后再次运行 load data infile 语句,即可立即导入数据。
VMware 为 Freebsd 6 设置网络
01. 打开 Edit -> Virtural Network Settings
2. 在 Host Virtural Adapters 中新增一个 VMnet9
3. 在 Host Virtural Network Mapping 中为 VMnet9 设置 Subnet
Subnet IP: 192.168.10.0; Subnet Mask:255.255.255.0
4. 在 DHCP 中为 VMnet9 设定 IP 地址段,可以设定为 192.168.10.100 ~ 192.168.10.120
5. 在 NAT 中把 VMnet host 设定为 VMnet9
6. 应用上述设置
7. 重启 Freebsd
Godaddy 打折码
3Godaddy 是全球最大的域名注册商,也是服务非常好的虚拟主机服务商。
在 Godaddy 注册 .com 域名,一般只要 9 美元,比国内的 新网、万网等注册商便宜多了。而且注册后立即可以得到域名密码,也就是 Authorization Code,有了这个密码,你就可以把域名随意转到任何一个注册商,不像国内,转移域名有很多限制,遇到个别服务商,还有恶意收费等情况!
这里还有非常棒的虚拟主机。
100G空间、每个月1000GB的传输流量、可以绑定无限个网站(注意!是多个独立域名指向不同的目录!!)、可以在 PHP4 和 PHP5 两种环境任意切换 ,25个MySQL数据库、每个数据库可以随意设定是 MySQL4 还是 MySQL5、数据库容量和主机容量共享!!这些设置,你猜需要多少钱?每个月 8 美元,一年是 96 美元,这只是按月付款,如果一次性付一年,还要便宜将近 10 美元!换成人民币,还不到 800 块钱!看看国内的虚拟主机,500M 容量,只能设定一个网站,一个数据库,PHP4,MySQL4,每个月2GB传输流量,这样的主机每年还要 1000 块钱!!
话题说远了,还是说说打折码,尽管刚才说 Godaddy 买东西很便宜,可是人家还提供了打折措施,只要输入一些打折码,在最终付款的时候还是可以便宜几美元!!
只要在最终付费(Review Your Shopping Cart)的时候,在申请折扣输入框(If you have a promo or source code enter it here)输入下列打折码即可。
这个打折码又称为 promo code 或 source code。
DAVID – $1 off any order
USA6 – $1 off any order
OYH3 – $2 off / $6.95 any .COM (renewals too!!!)
goox3004at – $2 off any order
OYH2 – $5 off a $30 purchase
RENEW35 – $5 off $30
gdg0805b – $5 off $30
OYH1 – 10% off whatever
SAVETEN – 10% off any order
SAVENOW – 10% off any order
AMAZON5 – 10% off any order
gdp0621a – 10% off domain registration
gdp1016b – 10% off (excludes domain renewals, domain transfers, .mobi domain name or gift cards)
gdm0420a – 25% off .MOBI registration
Symfony 数据库连接 utf8 (二)
1前文所述的代码,可以加在每个 Module 的 Actions 类的构造函数中,这样就确保了每次数据库链接时都是按照 utf8 编码进行传输和读取的。
但如果 Module 多了,到处重复代码可是一件烦人的事,也严重违反了 DRY(Don’t Repeat Youself) 原则,另外,有些 action 只显示一些表单或其他内容,并不需要数据库连接,而在构造函数中调用那段代码,每次都会连接数据库,造成了不必要的性能损失,因此,我们要进行一下小小的重构。
研究了 Symfony 的框架,发现他在做数据库方面的处理时,用了第三方的工具来封装,Creole 和 Propel,这 2 个工具之间的关系我还没深入研究,据我目前的理解,Creole 是对 MySQL 等数据库的底层封装,Propel 提供了应用层的逻辑代码,也就是说,在写跟逻辑有关代码时,用 Propel 把 SQL 语句封装起来,等语句都拼接好后,调用 Creole 的接口连接数据库。
我看了 Creole 的代码,找到了 getConnection 这个静态方法,他负责解析 DSN 并返回一个数据库连接。我们要做的,就是在每个需要数据库连接会话开始时,发送一条
语句,这个方法正好给了我们这个机会,因此,我在这个方法的 return 语句前面,调用了另一个方法:
self::setUTF8($obj);
?>
$obj 是 getConnection 要 return 的数据库连接。
打开 symfony/vendor/creole/Creole.php ,在 getConnection 方法的 return 前面加入上面这条语句,然后写出方法的定义:
if( !defined( 'IS_CONN_UTF8' ) ) {
define( 'IS_CONN_UTF8', 1 );
$query = 'SET NAMES "utf8"';
$statement = $connection->prepareStatement($query);
return $statement->executeQuery();
}
}
?>
说明:为了保证 SQL 语句只被发送一次,定义了宏作为判断标志。下次调用这个方法的时候,不会执行任何操作。
Symfony 数据库连接 utf8
0
$query = 'SET NAMES "utf8"';
$statement = $connection->prepareStatement($query);
$resultset = $statement->executeQuery();
?>
Symfony 在处理 PHP 与 MySQL 连接的时候,用的可能是 latin1 编码,也就是说,用户在表单里提交一个多字节字符串,比如“你好”,经历了如下几步,才进入到数据库:
1、浏览器把用户在输入框输入的内容按 utf8 编码,然后提交到服务端,PHP 接收到这个字符串;
2、PHP 建立 MySQL 连接,这个时候,用的是默认连接,如果当时 MySQL 服务器的连接编码是 latin1(通常默认都是 latin1),那么,PHP 会把接收到的字符串按 latin1 转码,然后传输给数据库;
3、数据库接收到这个字符串,要把它存到表里,由于接收过来的是 latin1 编码的字符串,则就按照这个编码存到表里。
这时会有个问题,数据库、表、字符串字段都是 utf8_general_ci 的编码方式,用 phpMyAdmin 查看,按说是能正常看到中文的。但是,由于 PHP 与 MySQL 是用 latin1 通讯,所以存到表里的是 latin1 字节序的字符,因此得到的是乱码。但是并不妨碍前端显示,因为在 PHP 取数据的时候,会按 latin1 -> utf8 的转换方式还原回来。虽然可以在前端页面正常显示,但我们维护数据库,备份、导入导出的时候看到一大堆乱码,显然很麻烦。
所以,有了最开始的那串代码,它的作用是,让 PHP 与 MySQL 用 utf8 编码方式进行通讯,数据库在往表里写入的时候,就是按照 utf8 字节序写的,因此我们用 phpMyAdmin 或者导出数据库文本文件的时候,都可以正常看到中文。
才疏学浅,不知所云
