我无法使用阿拉伯语文本进行变音符号不敏感搜索。
我已经测试了相关表格的多个设置: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
答案 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。试试吧。