2013-07-21 56 views
0

我制作了一个带有大约10万字的旁遮普语Unicode字典。有一个字母,在unicode的代码是ਸ਼,并且有很多这样的字母,如。但在这种语言中,字母下的字母也可以单独键入,但unicode中包含字母。在db中,word表中有单词,word_hash中有单词的md5。当我尝试使用语句SELECT * FROM db WHERE word_hash = md5('word');的php搜索数据库时,它导致找不到带有这些点的字母的记录。当我试图搜索时,我发现由搜索语法生成的db和md5中的单词的md5是不同的。为什么这样?我通过一个文本框输入了所有的单词,并且输入的md5与mysql语法一致。unicode文本的MD5转换

对于例如:对这个词ਸ਼ਰਬਤ45f756f02a28b5ec48ddf369db6ad7e6通过MySQL查询,并在数据库中回荡代码d6da1a44526c5ab1259dcc05404b1e8c

两名候补为ਸ਼ਸ਼

+0

你看看http://stackoverflow.com/questions/2446778/how-to-display-unicode-data-with-php?rq=1 – nKandel

+3

你为什么用散列而不是单词搜索?您应该将这些单词存储在[规范化形式](http://unicode.org/reports/tr15/)中。然后,您可以使用单词而不是散列进行搜索。 – Gumbo

+0

我需要使用md5进行搜索,因为当我以规范化的形式进行搜索时,它会考虑带有和不带圆点的字母。如果有没有圆点的字,它会显示结果,即使我们键入圆点也是如此。 .. – shahbaz

回答

1

你有什么这里有不同的Unicode正常化形式。有组合字符,其中基本字符与变音符或其他字符组合形成替代版本,但有时此替代版本也可能作为独立字符存在。例如:

ਸ਼ GURMUKHI LETTER SHA (U+0A36) 
ਸ GURMUKHI LETTER SA (U+0A38) 
਼ GURMUKHI SIGN NUKTA (U+0A3C) 
ਸ + ਼ (U+0A38 + U+0A3C) equivalent to ਸ਼ U+0A36 

(我不实际知道如果GURMUKHI SIGN NUKTA是正确的结合点在这里,因为我不知道古尔穆基,但你的想法。)

对于存储和比较,你应该决定一种形式或另一种形式,因为预测输入格式通常是不可能的。你可以使用Unicode规范化过程来完成这个过程,Unicode过程可以在两种形式之间进行转换。在PHP中,您可以使用Normalizer class来执行此操作。

我需要的,因为当我在一个规范化的形式做到这一点,它认为有和没有点相同的信用MD5进行搜索..

你的第二个问题是,你发明了一个过于复杂的解决方案,一个简单的问题:整理。数据库使用整理规则进行“模糊”匹配,即将“matinee”和“matineé”视为相同,或者在您的情况下使用“ਸ਼”和“ਸ”。您可以设置在列的默认排序规则,但你can influence it during query time as well

SELECT ... WHERE foo = 'bar' COLLATE utf8_bin; 

如果你想绝对匹配,使用utf8_bin整理或其他相当的_bin(二进制)排序为您所选择的编码。

+1

我会补充一点,即使正常化NFC,'U + 0A36'将变成'U + 0A38 + U + 0A3C',因为该字符被列为[组合排除](http://www.unicode .ORG /报告/ TR15 /#Primary_Exclusion_List_Table)。这*可能*解释了“考虑与没有点相同的评论”,尽管我不确定。 – PleaseStand

+0

thxx我们回答...但是当我将编码更改为utf8_bin ...它甚至不显示单个记录... – shahbaz

+1

@sha *整理!*编码是'utf8',但是您担心的是是*排序规则*'utf8_bin'。无论如何,如果它不匹配,因为二进制('_bin')值是不同的。你是否已经将数据库中的搜索值和值归一化为上面讨论的相同的归一化形式? – deceze