我在utf8 MySQL表中存储一个varchar,并使用utf8_general_ci排序规则。我有一个关于varchar的唯一索引。我想在PHP中做一个字符串比较,它等同于MySQL对索引所做的操作。
一个具体的例子是,在这种情况发生之前,我希望能够检测到PHP中的'a‘是否等同于’+‘:
mysql> insert UniTest (str) values ('a');
Query OK, 1 row affected (0.00 sec)
mysql> insert UniTest (str) values ('À');
ERROR 1062 (23000): Duplicate entry 'À' for key 1
发布于 2009-01-23 09:25:58
排序规则与存储无关。您需要设置字符集来确定存储编码。排序规则控制比较和排序应该如何发生。排序规则必须是字符集感知的,否则它与字符集无关。
要回答您的问题,您可以使用iconv
来翻译文本,然后进行比较。例如:
function compare($s1, $s2) {
return strcmp(
iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $s1),
iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $s2));
}
这基本上就是MySql为您做的事情,尽管它可能更快,而且它的排序表可能与ISO-8859-1//TRANSLIT
略有不同。这一点不能完全确定。
不过,正如其他人已经建议的那样,使用数据库可能会更容易。
发布于 2009-01-22 22:14:20
为什么不让MySQL来决定是否已经存在具有相同键的记录呢?
您可以运行一个SELECT
查询来询问是否已经存在具有此属性的记录:
SELECT 1
FROM UniTest
WHERE str = "À"
或者,您可以尝试插入新记录,然后使用函数mysql_error()和mysql_errno()查看是否发生了错误。
发布于 2009-02-04 20:33:12
所以,如果我没弄错的话,您想在PHP语言中进行类似的比较,就像在MySQL中进行UTF8通用索引检查一样?
最简单的方法是创建一个helper函数,它将根据MySSQL使用的utf8_general_ci规则转换字符串,这主要是将某些字母转换为基本字母。
该MySQL排序规则如下所示:
http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html
例如,如果您稍微向下滚动到左侧的“金色A”,您将看到转换为该A的所有字符。
给定一个帮助器函数,例如调用utf8g_to_ascii()
,您可以编写一个函数:
function utf8_compare($s1, $s2) {
$a = utf8g_to_ascii($s1);
$b = utf8g_to_ascii($s2);
return strcmp( $a, $b );
}
我将我的代码建模如下:
http://dev.splitbrain.org/view/darcs/dokuwiki/inc/utf8.php
https://stackoverflow.com/questions/471021
复制相似问题