mysql - 为什么不区分大小写在 latin1 和 utf8 中不同?

标签 mysql utf-8 collation iso-8859-1

我一直在将一些大表从 latin1 转换为 utf8,发现与 this user 相同的问题.但是我从中转换的表具有排序规则 latin1_general_ci(或 latin_swedish_ci)。那么为什么MySQL在不同的字符集下对“case-insensitive”有不同的解释呢?因为 latin1 不检查 o=ö 或 o=oe,所以唯一的 latin1 索引会产生数千次冲突。

最佳答案

有两个原因:

大小写是语言环境的东西。不同的语言环境可以赋予不同的字符作为小写(或大写)。 IIRC 土耳其语 I 应将 ı(U+0131 拉丁文小写字母 DOTLESS I)作为小写字母。参见例如Unicode Casemap FAQ .所以 _swedish_ 是相关的。

此外,generic unicode 算法很复杂,并且从 Unicode 字符串映射到 Unicode 字符串。在其他字符集上使用它可能会导致问题(实现应该检查和处理转换后的大小写在原始字符集之外的情况)。此外,Unicode 是“现代的”,因此 MySQL 用户[确实]不希望 MySQL 将字符串相等性从一个版本更改为下一个版本(例如,pre-Unicode 到 Unicode-as-first-class-charset [顺便说一句,它不是然而如此]).

关于mysql - 为什么不区分大小写在 latin1 和 utf8 中不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49652885/

相关文章:

mysql - 每 3 个字符串后用空格替换逗号

mysql - SQL - 外键约束的格式不正确

linux - Haskell:quoteFile 在 unicode 字符上带有 "invalid byte sequence"的文本文件上失败

php - 如何在网页上使用 php 和 mysql 显示印地语/马拉地语文本

mysql - 操作 '=' 的排序规则 (utf8mb4_unicode_ci,IMPLICIT) 和 (utf8mb4_general_ci,IMPLICIT) 的非法混合

mysql - LEFT JOIN 显示 NULL 行 + WHERE

java - JSP 数据库访问不工作

java - 如何在 HttpServlet、HttpServletRequest 中设置默认字符编码?

php - 从 mysql 回显特殊字符

mysql - Powershell 哈希表和重复键