MySQL变音符号不敏感搜索(阿拉伯语)

时间:2015-03-04 19:41:06

标签: mysql arabic diacritics

我无法使用阿拉伯语文本进行变音符号不敏感搜索。

我已经测试了相关表格的多个设置:utf8和utf16中的编码以及utf8_general_ci,utf16_general_ci和utf16_unicode_ci中的归类。

搜索适用于特殊字符。即:

select * from test where text like '%a%'

将返回文字为a,å或ä的列。但它不适用于阿拉伯语变音符号。即如果文本是بسم并且我搜索بسم,我没有得到任何点击。

任何想法如何通过这个?

真正的用法后来将是PHP(搜索功能),但我直接在MySQL数据库中进行测试,然后将其移植到PHP。

(来自评论)

CREATE TABLE test (
    ↵ id int(11) unsigned NOT NULL AUTO_INCREMENT,
    ↵ text text COLLATE utf8_unicode_ci,
    ↵ PRIMARY KEY (id)↵
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

3 个答案:

答案 0 :(得分:2)

SHOW COLLATIONS;查看您可用的排序规则。在我的版本中,我没有看到任何看起来适合阿拉伯语的东西。但是,utf8_unicode_ci似乎可以进行你想要的折叠。这是一个简单的尝试方法:

SELECT 'بِسْمِ' = 'بسم' COLLATE utf8_unicode_ci;

我得到的结果是1(真实),意味着他们被认为是平等的。对于utf8_general_ci,它返回0,意思是不相等。

然后将您的字段声明为VARCHAR(...) (or TEXT) CHARACTER SET utf8 COLLATE utf8_unicode_ci;同样适用于utf8mb4。

要构建您自己的排序规则(并将其提交以包含在将来的版本中),请参阅http://dev.mysql.com/doc/refman/5.6/en/adding-collation.html

答案 1 :(得分:2)

(这不是“答案”,而是“决议”。)

似乎LIKE不适用于您的阿拉伯字符串。我不知道它失败了多少。我建议你在http://bugs.mysql.com写一个错误报告。以下是一个测试用例,显示LIKE '...'LIKE '%...%'都找不到两个字符串,而'='则有效:

CREATE  TABLE so28863402 (
    id int(11) unsigned NOT NULL AUTO_INCREMENT,
    txt text COLLATE utf8_unicode_ci,   -- deliberate choice of COLLATION
    PRIMARY KEY (id)
) ENGINE=InnoDB
        DEFAULT CHARSET=utf8;
INSERT INTO so28863402 (txt) VALUES
    (UNHEX('D8A8D990D8B3D992D985D990')),  -- Using hex to avoid any copy/paste issues
    (UNHEX('D8A8D8B3D985'));  -- The values should compare equal
SELECT id, txt, HEX(txt) FROM so28863402;
SELECT txt, COUNT(*) FROM so28863402 GROUP BY txt; -- GROUP BY finds them equal.
SELECT * from so28863402
    WHERE txt = 'بسم';   -- Finds both rows (correct)
SELECT * from so28863402
    WHERE txt LIKE '%بسم%';  -- Finds one row (incorrect)
-- Further checks:
SELECT * FROM so28863402 WHERE txt  =   UNHEX(  'D8A8D8B3D985'  );
SELECT * FROM so28863402 WHERE txt LIKE UNHEX(  'D8A8D8B3D985'  );
SELECT * FROM so28863402 WHERE txt LIKE UNHEX('25D8A8D8B3D98525'); -- x25 is '%'

答案 2 :(得分:-1)

SELECT * FROM table name
WHERE MATCH (name of column in MYSQL )
AGAINST ('بسم ' IN BOOLEAN MODE);

此命令忽略Diacritic。试试吧。