业务场景:需求点项目excel数据导入,会对重复名称校验拦截,如:之前已插入名称为-半角括号“(a)”,再次插入一条名称为-全角括号项目“(a)”,校验通过,但是插入数据库报错。
原因:由于数据库默认忽略括号全角、半角,导致一条数据代码数据校验通过,但插入数据唯一键冲突。
如果使用的数据库是‘utf8mb4_unicode_ci’,在数据库层面通过SQL进行排序、对比操作时,会忽略全角、半角、大小写区分,如在代码中进行排序和对比操作,需求考虑逻辑的一致性。
MySQL数据库中utf8mb4_unicode_ci字符集的特性
1. utf8mb4_unicode_ci字符集概述
utf8mb4_unicode_ci
是MySQL中的一种字符集和排序规则(collation)。utf8mb4
表示能够支持最多4个字节的UTF-8编码,这使得它能够存储任何Unicode字符,包括表情符号等。_ci
后缀表示case-insensitive(不区分大小写)。
2. 不区分全角/半角和大小写的原因
utf8mb4_unicode_ci
字符集在比较字符时,不区分全角/半角和大小写,主要基于以下原因:
-
Unicode标准:
utf8mb4_unicode_ci
的排序规则基于Unicode标准,该标准旨在统一字符表示,以便跨语言和地区兼容。在Unicode标准中,全角和半角字符可能被认为是等价的变体。 -
不区分大小写:
_ci
后缀意味着在排序和比较时不区分大小写。这是为了支持那些不区分大小写的语言环境,使得数据库能更通用和灵活。 -
国际化和本地化:不区分全角/半角和大小写可以让数据库更好地适应国际化和本地化的需求,因为不同的语言和地区可能对字符的处理有不同的要求。
3. 对数据库设计的影响
在设计数据库时,需要考虑到这些特性,特别是当你的应用程序需要区分全角/半角或大小写时。在这种情况下,你可能需要:
-
选择不同的排序规则:选择一个区分大小写或全角/半角的排序规则,如
utf8mb4_bin
,它是二进制的,会区分字符的所有差异。 -
自定义排序规则:如果没有现成的排序规则满足需求,可能需要自定义排序规则。
-
应用层处理:在某些情况下,可能需要在应用程序层面上进行字符处理,以确保全角/半角和大小写的正确处理。
总结
utf8mb4_unicode_ci
字符集不区分全角/半角和大小写,这是基于Unicode标准和国际化需求设计的。在需要区分这些差异的场景中,可能需要选择或自定义不同的排序规则,或者在应用层面上进行处理,以确保数据的准确性和一致性。