代码之家  ›  专栏  ›  技术社区  ›  twk Mark Adler

与MySQL一样,在PHP中比较字符串

  •  6
  • twk Mark Adler  · 技术社区  · 17 年前

    我正在utf8 MySQL表中存储一个varchar,并使用utf8\u general\u ci排序规则。我在varchar上有一个唯一的索引。我想用PHP做一个字符串比较,这相当于MySQL对索引所做的比较。

    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
    
    5 回复  |  直到 12 年前
        1
  •  9
  •   troelskn    17 年前

    排序规则与存储无关。您需要设置字符集来确定存储编码。排序规则控制比较和排序的方式。排序规则必须能够识别字符集,否则它与字符集无关。

    要回答您的问题,您可以使用 iconv 翻译课文,然后比较。例如:

    function compare($s1, $s2) {
      return strcmp(
        iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $s1),
        iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $s2));
    }
    

    这基本上就是MySql为您所做的,尽管它可能更快,并且它的排序规则表可能与MySql略有不同 ISO-8859-1//TRANSLIT . 对此并不完全确定。

        2
  •  1
  •   Gumbo    17 年前

    为什么不让MySQL决定是否已经有一个具有相同密钥的记录?

    你可以运行一个 SELECT 查询以询问是否已有具有此属性的记录:

    SELECT 1
    FROM UniTest
    WHERE str = "À"
    

    或者您可以尝试插入新记录并使用这些函数 mysql_error() 和 mysql_errno()

        3
  •  1
  •   BenMorel Manish Pradhan    12 年前

    通过向MySQL提交查询,让MySQL完成这项工作是否合理,如:

    SELECT CASE WHEN '$a' = '$b' THEN 1 ELSE 0 END
    


    编辑后澄清:

    您可以一次性遍历笛卡尔连接到自身的整个感兴趣的字符集,并构建一个标准的php关联等价集数组。

        for each $char1 in $charset {  
            for each $char2 in $charset {  
                $charmatch[$char1][$char2] = mysqlTestMatch($char1, $char2));  
            }  
        }  
    

    然后您需要逐个字符测试每个字符串,以查看a)它们是否相同,或者如果不相同,b)它们是否等效。

        4
  •  0
  •   alphadogg    17 年前

    所以,如果我理解正确,您希望在PHP中进行类似的比较,就像在MySQL中进行UTF-8常规索引检查一样?

    下面列出了MySQL排序规则:

    http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html
    

    给定一个助手函数,例如调用 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
    
        5
  •  0
  •   masakielastic    13 年前

    使用intl的拼音器或音译器。

    $s1 = 'a';
    $s2 = 'À';
    
    var_dump(
        is_same_string($s1, $s2),
        $s1 === transliterator_transliterate('Any-Latin; Latin-ASCII; Lower()', $s2)
    );
    
    function is_same_string($str, $str2, $locale = 'en_US')
    {
        $coll = collator_create($locale);
        collator_set_strength($coll, Collator::PRIMARY);  
        return 0 === collator_compare($coll, $str, $str2);
    }
    
    推荐文章