我用Unicode制作了大约10万字的旁遮普语的字典。有一个字母ਸ਼
,其unicode代码为ਸ਼
,有许多此类字母,如ਖ਼
ਜ਼
ਗ਼
ਫ਼
。但是在这种语言中,字母下面的点也可以单独输入,但unicode中有组合字母。在数据库中,word
表中有单词,word_hash
中有单词的md5。当我尝试使用带有语句SELECT * FROM db WHERE word_hash = md5('word');
的php搜索数据库时,它会导致找不到包含带有此类字母的单词的记录。当我试图搜索时,我发现db中的单词的md5和搜索语法生成的md5是不同的。为什么会这样?我已经通过文本框输入了所有单词,输入的md5是使用mysql语法。
例如:单词ਸ਼ਰਬਤ
的代码是45f756f02a28b5ec48ddf369db6ad7e6
,由mysql查询回显,在db中是d6da1a44526c5ab1259dcc05404b1e8c
ਸ਼
的两个替代ਸ਼
和ਸ਼
答案 0 :(得分:1)
这里有不同的Unicode规范化表单。有组合字符,其中基本字符与变音符号或其他字符组合以形成备用版本,但有时此替代版本也可作为独立字符存在。 E.g:
ਸ਼ 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是否是正确的组合点,因为我不知道Gurmukhi,但你明白了。)
对于存储和比较,您应该决定一种形式或另一种形式,因为通常无法预测输入将采用哪种格式。您可以使用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
(二进制)归类。