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

问题描述 投票:3回答:3

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

我已经测试了有问题的表的多个设置: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 
mysql arabic diacritics
3个回答
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


2
投票

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

似乎LIKE不适用于您的阿拉伯字符串。我不知道它失败了多少。我建议你在http://bugs.mysql.com写一个bug报告。这是一个测试用例,表明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 '%'

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

此命令忽略Diacritic。试试吧。

© www.soinside.com 2019 - 2024. All rights reserved.