SELECT Hüsby 返回“错误”输出 Husby

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

在同一个数据库中,我运行查询并得到一个正确的结果和一个错误的结果。

正确

SELECT Ort FROM `stammdaten` WHERE `Ort` = 'Husby';
    
Ort 
Husby   
Husby   

错了

SELECT Ort FROM stammdaten WHERE Ort = 'Hüsby';

Ort
Husby
Husby

数据库:utf8mb4_unicode_ci

表:utf8mb4_unicode_ci

字段:utf8mb4_unicode_ci

有人知道我还可以更改或检查什么吗?

mysql utf-8 utf8mb4
3个回答
2
投票

您可以查看文档,因为一切都按预期工作:

  • 10.3.1 排序规则命名约定:“排序规则后缀指示排序规则是区分大小写、区分重音、区分假名(或其某种组合)还是二进制。”该表显示后缀 _ci
     至少代表“
    case insensitivity”。
  • "
  • 对于未指定区分重音的非二进制排序规则名称,由区分大小写决定。如果排序规则名称不包含 _ai
    _as
    ,则名称中的 
    _ci
     意味着 
    _ai
    _cs
    名称中暗示了 
    _as
    ”因此排序规则
    utf8mb4_unicode_ci
     
    也不区分重音
  • 如果您想要重音
  • 敏感,但同时想要大小写不敏感,请按照10.2 MySQL 中的字符集和排序规则
    选择
    utf8mb4_0900_as_ci
  • 盲目地将列和/或文字转换为
  • BINARY
     类型与应用 
    utf8mb4_bin
     排序规则不同,因为它通常带有更多限制。请参阅 
    10.8.5 二进制排序规则与 _bin 排序规则的比较
需要理解 Unicode(

ü

),需要理解不区分大小写规则(
ß
SS
),需要理解重音不敏感(
Café
cafè
)。否则,您最终会存储无法正确查找或过滤的数据,因为您选择了错误的排序规则。理解排序也是一个方面(
ü
是在
u
之后排序还是在
ö
之后排序?),尽管很少有人感兴趣。


1
投票
可以使用BINARY来比较

CREATE TABLE stammdaten (Ort varchar(10)) CHARACTER SET UTF8MB4 COLLATE Utf8mb4_unicode_ci


INSERT INTO stammdaten VALUES('Husby')


SELECT Ort FROM stammdaten WHERE BINARY Ort = BINARY 'Hüsby';
|奥尔特 |
| :-- |

db<>小提琴这里


0
投票
我从

https://mysql.rjweb.org/utf8mb4_collations.html看到匈牙利语和土耳其语将ü

视为
u
v
之间的单独字母。如果这是您需要的,请切换到 utf8mb4_hu_0900_ai_ci 或 utf8mb4_tr_0900_ai_ci。

可能

ALTER TABLE ... CONVERT TO COLLATION utf8mb4_hu_0900_ai_ci;

就足够了。注意:需要对所有在此类字符串上为 
JOINed
 的表执行此操作,并且它也会转换所有非 UTF-8 列。因此,请在单独的环境中进行测试。

如果

CONVERT TO

 太像大锤了,那么请考虑 
ALTER TABLE ... MODIFY col ...
,但一定要包括该列的其他属性。

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