首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在PHP中比较字符串的方法与MySQL相同。

在PHP中比较字符串的方法与MySQL相同。
EN

Stack Overflow用户
提问于 2009-01-22 22:05:48
回答 4查看 5.2K关注 0票数 6

我在utf8 MySQL表中存储一个varchar,并使用utf8_general_ci排序规则。我有一个关于varchar的唯一索引。我想在PHP中做一个字符串比较,它等同于MySQL对索引所做的操作。

一个具体的例子是,在这种情况发生之前,我希望能够检测到PHP中的'a‘是否等同于’+‘:

代码语言:javascript
运行
复制
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
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-23 09:25:58

排序规则与存储无关。您需要设置字符集来确定存储编码。排序规则控制比较和排序应该如何发生。排序规则必须是字符集感知的,否则它与字符集无关。

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

代码语言:javascript
运行
复制
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略有不同。这一点不能完全确定。

不过,正如其他人已经建议的那样,使用数据库可能会更容易。

票数 9
EN

Stack Overflow用户

发布于 2009-01-22 22:14:20

为什么不让MySQL来决定是否已经存在具有相同键的记录呢?

您可以运行一个SELECT查询来询问是否已经存在具有此属性的记录:

代码语言:javascript
运行
复制
SELECT 1
FROM UniTest
WHERE str = "À"

或者,您可以尝试插入新记录,然后使用函数mysql_error()mysql_errno()查看是否发生了错误。

票数 1
EN

Stack Overflow用户

发布于 2009-02-04 20:33:12

所以,如果我没弄错的话,您想在PHP语言中进行类似的比较,就像在MySQL中进行UTF8通用索引检查一样?

最简单的方法是创建一个helper函数,它将根据MySSQL使用的utf8_general_ci规则转换字符串,这主要是将某些字母转换为基本字母。

该MySQL排序规则如下所示:

代码语言:javascript
运行
复制
http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html

例如,如果您稍微向下滚动到左侧的“金色A”,您将看到转换为该A的所有字符。

给定一个帮助器函数,例如调用utf8g_to_ascii(),您可以编写一个函数:

代码语言:javascript
运行
复制
function utf8_compare($s1, $s2) {
   $a = utf8g_to_ascii($s1);
   $b = utf8g_to_ascii($s2);
   return strcmp( $a, $b );
}

我将我的代码建模如下:

代码语言:javascript
运行
复制
http://dev.splitbrain.org/view/darcs/dokuwiki/inc/utf8.php
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/471021

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档