MySQLUniqueKeyCharset
From LeakonWiki
Contents |
MySQL Unique Key and Character Set
MySQL 唯一索引和字符集之间的一个简单测试。
可以看到,mysql_real_escape_string() 是和当前连接的字符集密切相关的。
它可以检查字符串的每一个字节,不会错误地对 %5c 等字符进行多余的转义。
测试代码
// 数据库抽血层
$databaseConn = DataInterface::getInstance();
$arrChars = array(
'%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F',
'%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F%93%3F%3F%94%3F%3F%3F%3F%3F%3F', // %93%3F 并不是一个有效的 GBK 字符
'%3F%3F%3F%3F%3F%3F%3F%3F%3F%3F%93%3F%3F%94%3F%3F%3F%3F%3F%3F' . urlencode('leakon'),
);
$SQLTrunc = "TRUNCATE test_charset";
$boolRes = $databaseConn->exec($SQLTrunc);
foreach ($arrChars as $encodedWord) {
$word = urldecode($encodedWord);
// escape 静态方法,就是调用 mysql_real_escape_string()
$word = DataInterface::escape($word);
$SQLIns = "INSERT INTO test_charset SET word = '$word' ";
$boolRes = $databaseConn->exec($SQLIns);
var_dump($boolRes);
var_dump($databaseConn->getError());
var_dump('--------');
}
程序输出
int(1)
array(0) {
}
string(8) "--------"
int(0)
array(3) {
["errno"]=>
int(1062)
["error"]=>
string(38) "Duplicate entry '??????????' for key 2"
["sql"]=>
string(61) "INSERT INTO test_charset SET word = '??????????????????' "
}
string(8) "--------"
int(0)
array(3) {
["errno"]=>
int(1062)
["error"]=>
string(38) "Duplicate entry '??????????' for key 2"
["sql"]=>
string(67) "INSERT INTO test_charset SET word = '??????????????????leakon' "
}
string(8) "--------"
表结构
CREATE TABLE `test_charset` ( `id` int(11) NOT NULL auto_increment, `word` char(100) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `word` (`word`) ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

