MySQLUniqueKeyCharset

From LeakonWiki

Jump to: navigation, search

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;

Personal tools