MySQL不区分变音符号搜索(阿拉伯语)

u4vypkhs  于 2023-01-29  发布在  Mysql
关注(0)|答案(4)|浏览(137)

我在对阿拉伯语文本进行不区分发音符号的搜索时遇到了问题。
我已经测试了所述扫描床的多个设置:utf8和utf16中的编码以及utf8_general_ci、utf16_general_ci和utf16_unicode_ci中的排序规则。
该搜索适用于åä特殊字符,即:

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

将返回文本为a,åor ä的列。但它不适用于阿拉伯语变音符号。即,如果文本为ëşêşêsês,而我搜索了ëşêsês,我没有得到任何匹配。
有什么办法可以解决这个问题吗?
真实的的用法稍后将是PHP(一个搜索函数),但我直接在MySQL数据库中工作,只是为了在将其移植到PHP之前进行测试。
(from评论)

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
laik7k3q

laik7k3q1#

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;utf8 mb 4也是如此。
要构建自己的归类(并提交它以包含在将来的版本中),请参见http://dev.mysql.com/doc/refman/5.6/en/adding-collation.html

ljo96ir5

ljo96ir52#

(This不是“答案”,而是“决议”)
看起来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 '%'
y1aodyip

y1aodyip3#

我也遇到过同样的问题,我用以下步骤解决了这个问题:
1.创建一个函数来删除变音符号并统一相似字符

CREATE FUNCTION AR_UNIFY(s VARCHAR(191) )
RETURNS VARCHAR(191)
DETERMINISTIC
BEGIN
    RETURN REPLACE( REPLACE( REPLACE( REPLACE( s,'أ','ا'), 'ي','ى'), 'إ','ا'), 'ة','ه') ;
END;

1.在SELECT语句内的条件中使用此函数,如下所示:

SELECT * FROM users WHERE AR_UNIFY(name) LIKE AR_UNIFY("%أإا%");
xdyibdwo

xdyibdwo4#

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

这个命令忽略变音符号。试试看。

相关问题