我的MySQL服务器在将数据存储到数据库时无法识别字符"æ"one_answers"ae"之间的差异,这给我带来了一些问题。我的目标是找到一个可以识别这些字符之间差异的字符集,我找到了它(utfmb3(,但它将被弃用,而新的替代方案(utfmb4(没有将这些字符识别为不同的字符。
我尝试过的:
set names 'utf8mb3';
select 'æ' = 'ae';
这个select返回0
(false(,这意味着这个字符集将这些字符视为不同的字符,这正是我所需要的,但MySQL给了我一个警告:"utf8mb3"已弃用,并将在将来的版本中删除。请改用utf8mb4
但当我做时
set names 'utf8mb4';
select 'æ' = 'ae';
此选择返回1
,这意味着utf8mb4
将这些字符视为相同的字符,这是不好的。。
那么,我的问题是,用什么字符集?如果我使用utfmb3
,它很快就会被弃用,这不好。如果我使用utfmb4
,它将无法正常工作。
=
和LIKE
比较应用排序规则(而不仅仅是字符集(来确定这种相等性。此语句对前两个排序规则返回零,对后两个排序顺序返回一。
SELECT 'æ' = 'ae' COLLATE utf8mb4_unicode_ci, -- 0
'æ' = 'ae' COLLATE utf8mb4_general_ci, -- 0
'æ' = 'ae' COLLATE utf8mb4_unicode_520_ci, -- 1
'æ' = 'ae' COLLATE utf8mb4_german2_ci -- 1
你的默认排序规则似乎是最后两个排序规则中的一个,或者其他一些排序规则,以你不希望的方式处理等式测试
您可以使用此语句查看连接的排序规则设置。我怀疑是utf8mb4_unicode_520_ci
。
SELECT @@collation_connection;
请确保为列定义所需的排序规则,并将连接排序规则设置为相同的排序规则。CCD_ 9是合适的。试试这个。
SET collation_connection = 'utf8mb4_unicode_ci';
SELECT 'æ' = 'ae' -- 0;
如果不更好地理解你的语言要求,很难给出更具体的建议。
更多信息请点击此处:MariaDB/MySQL中的utf8mb4_unicode_ci和utf8mb 4_unicode_520_ci排序规则之间的区别?
联盟'utf8mb4_unicode_ci'是当前要使用的联盟。确保您将客户端(即php、node.python(设置为也使用正确的字符集(在db客户端对象和环境配置中(。