6.6. 数据库的 Unicode 注意事项
Red Hat Single Sign-On 中的数据库模式仅在以下特殊字段中考虑 Unicode 字符串:
- realms:显示名称、HTML 显示名称
- 联邦供应商:显示名称
- Users: username, given name, last name, attribute name and values
- groups: name, attribute name 和 values
- roles: name
- 对象的描述
否则,字符仅限于包含在数据库编码中的字符,通常是 8 位。但是,对于某些数据库系统,可以启用 Unicode 字符的 UTF-8 编码,并在所有文本字段中使用完整的 Unicode 字符集。通常,这以比 8 位编码更短的字符串的最大长度相平衡。
某些数据库需要特殊设置数据库和/或 JDBC 驱动程序才能处理 Unicode 字符。请在下面找到您的数据库的设置。请注意,如果此处列出了数据库,它仍然可以在数据库和 JDBC 驱动程序级别上正确处理 UTF-8 编码。
从技术上讲,对于 Unicode 支持所有字段的关键条件是数据库是否允许为 VARCHAR
和 CHAR
字段设置 Unicode 字符。如果是,则 Unicode 将存在的高可能性,通常以字段长度为代价。如果它只在 NVARCHAR
和 NCHAR
字段中支持 Unicode,则对所有文本字段的 Unicode 支持不太可能,因为 Keycloak 模式会广泛使用 VARCHAR
和 CHAR
字段。
6.6.1. Oracle 数据库
Unicode 字符可以被正确处理,提供了数据库在 VARCHAR
和 CHAR
字段中支持(例如,使用 AL32UTF8
字符集作为数据库字符集)创建的 Unicode 字符。JDBC 驱动程序不需要特殊设置。
如果数据库字符集不是 Unicode,则在特殊字段中使用 Unicode 字符,则需要配置 JDBC 驱动程序,并将连接属性 oracle.jdbc.defaultNChar
设置为 true
。这可能是明智的,但并非严格必要,也要将 oracle.jdbc.convert.convertNcharLiterals
连接属性设为 true
。这些属性可以设置为系统属性或连接属性。请注意,设置 oracle.jdbc.defaultNChar
可能会对性能造成负面影响。详情请查看 Oracle JDBC 驱动程序配置文档。
6.6.2. Microsoft SQL Server 数据库
Unicode 字符仅针对特殊字段正确处理。不需要特殊设置 JDBC 驱动程序或数据库。
6.6.3. MySQL 数据库
Unicode 字符可以被正确处理,提供了数据库是使用 CREATE DATABASE
命令的 VARCHAR
和 CHAR
字段中的 Unicode 支持创建的(例如,使用 utf8
字符集作为 MySQL 5.5 中设置的默认数据库字符)。请注意,utf8mb4
字符集无法正常工作,因为不同的存储要求被设置为 utf8
字符集 [1]).请注意,在这种情况下,非特殊字段的长度限制不适用,因为创建了列来容纳给定的字符数,而不是字节。如果数据库默认字符集不允许存储 Unicode,则只有特殊字段允许存储 Unicode 值。
在 JDBC 驱动程序设置一侧,需要将连接属性 characterEncoding=UTF-8
添加到 JDBC 连接设置中。
6.6.4. PostgreSQL 数据库
当数据库字符设置为 UTF8
时,支持 Unicode。在这种情况下,任何字段中都可以使用 Unicode 字符,非特殊字段没有减少字段长度。不需要特殊设置 JDBC 驱动程序。
PostgreSQL 数据库的字符集在创建时决定。您可以使用 SQL 命令确定 PostgreSQL 集群的默认字符集
show server_encoding;
如果默认字符集不是 UTF 8,您可以使用 UTF8 创建数据库作为其字符集,如下所示:
create database keycloak with encoding 'UTF8';