暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库字符序

原创 姚崇 2023-04-10
1555

什么是字符序?

字符序(Collation)是指在字符集中对字符进行排序和比较的规则。字符序定义了如何在数据库中比较字符串数据(例如,文本和字符)。字符序影响字符串数据的排序顺序以及字符串搜索和比较操作的行为。

字符集(Character Set)是一组字符的集合,其中每个字符都有一个唯一的编码。字符集定义了如何在数据库中表示和存储字符数据。例如,常见的字符集有 ASCII、UTF-8、GBK 等。

字符序与字符集密切相关,每个字符集可以有一个或多个字符序。例如,在 MySQL 数据库中,对于 “utf8mb4” 字符集,你可能会看到 “utf8mb4_general_ci”、“utf8mb4_unicode_ci” 等不同的字符序。这些字符序主要区别在于如何对字符串进行排序和比较。"_ci" 表示 “case-insensitive”(不区分大小写),而 “_cs” 表示 “case-sensitive”(区分大小写)。

当你在数据库中创建表或插入数据时,可以选择适当的字符集和字符序,以确保数据存储和比较按照预期的方式进行。为了获得正确的排序和搜索结果,建议使用适当的字符集和字符序。在选择字符集和字符序时,你需要权衡性能、存储空间、字符支持范围等因素。通常情况下,使用通用的字符集(如 UTF-8)和默认的字符序是一个比较好的选择,因为它们可以满足多种语言和字符需求。

EUC_CN是哪种数据库的哪种字符集的字符序

EUC_CN(Extended Unix Code for Simplified Chinese)是一种字符集,主要用于支持简体中文字符。它是 EUC(Extended Unix Code)家族的一员,主要用于 Unix 类操作系统中表示简体中文字符。EUC_CN 基于 GB2312 标准,包括 GB2312 中的所有字符。

EUC_CN 并非特定数据库的字符集,而是一种编码标准。不过,许多数据库系统支持 EUC_CN 字符集,例如 PostgreSQL 和 Oracle。在这些数据库系统中,你可以为数据库、表或列设置 EUC_CN 字符集,以便存储和处理简体中文字符。

值得注意的是,随着 Unicode 的普及和 UTF-8 编码的广泛使用,越来越多的数据库和应用程序开始使用 UTF-8 编码。UTF-8 是一种通用的字符集,支持多种语言和字符,包括简体中文。相比于 EUC_CN,UTF-8 更具有兼容性和通用性。因此,在大多数情况下,建议使用 UTF-8 字符集来处理简体中文字符。

lightdb@postgres=# \l+
                                                             List of databases
   Name    |  Owner  | Encoding | Collate | Ctype |  Access privileges  |  Size   | Tablespace |                Description                 
-----------+---------+----------+---------+-------+---------------------+---------+------------+--------------------------------------------
 lt_test   | lightdb | EUC_CN   | zh_CN   | zh_CN |                     | 14 MB   | pg_default | 
 postgres  | lightdb | EUC_CN   | zh_CN   | zh_CN |                     | 16 MB   | pg_default | default administrative connection database
 template0 | lightdb | EUC_CN   | zh_CN   | zh_CN | =c/lightdb         +| 8217 kB | pg_default | unmodifiable empty database
           |         |          |         |       | lightdb=CTc/lightdb |         |            | 
 template1 | lightdb | EUC_CN   | zh_CN   | zh_CN | =c/lightdb         +| 14 MB   | pg_default | default template for new databases
           |         |          |         |       | lightdb=CTc/lightdb |         |            | 
(4 rows)

如何查询MySQL字符序

在 MySQL 数据库中,你可以通过查询相关的系统表来获取字符集和字符序的信息。以下是一些 SQL 查询示例,用于查询 MySQL 数据库的字符集和字符序信息:

查询当前数据库的默认字符集和字符序:

use test SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = DATABASE(); +----------------------------+------------------------+ | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | +----------------------------+------------------------+ | utf8mb4 | utf8mb4_general_ci | +----------------------------+------------------------+ 1 row in set (0.00 sec)

查询所有可用的字符集:

SHOW CHARACTER SET; +----------+---------------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+---------------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | swe7 | 7bit Swedish | swe7_swedish_ci | 1 | | ascii | US ASCII | ascii_general_ci | 1 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 | | tis620 | TIS620 Thai | tis620_thai_ci | 1 | | euckr | EUC-KR Korean | euckr_korean_ci | 2 | | koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | greek | ISO 8859-7 Greek | greek_general_ci | 1 | | cp1250 | Windows Central European | cp1250_general_ci | 1 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 | | cp866 | DOS Russian | cp866_general_ci | 1 | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 | | macce | Mac Central European | macce_general_ci | 1 | | macroman | Mac West European | macroman_general_ci | 1 | | cp852 | DOS Central European | cp852_general_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | utf32 | UTF-32 Unicode | utf32_general_ci | 4 | | binary | Binary pseudo charset | binary | 1 | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | | gb18030 | China National Standard GB18030 | gb18030_chinese_ci | 4 | +----------+---------------------------------+---------------------+--------+ 41 rows in set (0.00 sec)

查询所有可用的字符序:

SHOW COLLATION; +------------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +------------------------+---------+-----+---------+----------+---------+ | utf8mb4_general_ci | utf8mb4 | 45 | Yes | Yes | 1 | | utf8mb4_bin | utf8mb4 | 46 | | Yes | 1 | | utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 8 | | utf8mb4_icelandic_ci | utf8mb4 | 225 | | Yes | 8 | | utf8mb4_latvian_ci | utf8mb4 | 226 | | Yes | 8 | | utf8mb4_romanian_ci | utf8mb4 | 227 | | Yes | 8 | | utf8mb4_slovenian_ci | utf8mb4 | 228 | | Yes | 8 | | utf8mb4_polish_ci | utf8mb4 | 229 | | Yes | 8 | | utf8mb4_estonian_ci | utf8mb4 | 230 | | Yes | 8 | | utf8mb4_spanish_ci | utf8mb4 | 231 | | Yes | 8 | | utf8mb4_swedish_ci | utf8mb4 | 232 | | Yes | 8 | | utf8mb4_turkish_ci | utf8mb4 | 233 | | Yes | 8 | | utf8mb4_czech_ci | utf8mb4 | 234 | | Yes | 8 | | utf8mb4_danish_ci | utf8mb4 | 235 | | Yes | 8 | | utf8mb4_lithuanian_ci | utf8mb4 | 236 | | Yes | 8 | | utf8mb4_slovak_ci | utf8mb4 | 237 | | Yes | 8 | | utf8mb4_spanish2_ci | utf8mb4 | 238 | | Yes | 8 | | utf8mb4_roman_ci | utf8mb4 | 239 | | Yes | 8 | | utf8mb4_persian_ci | utf8mb4 | 240 | | Yes | 8 | | utf8mb4_esperanto_ci | utf8mb4 | 241 | | Yes | 8 | | utf8mb4_hungarian_ci | utf8mb4 | 242 | | Yes | 8 | | utf8mb4_sinhala_ci | utf8mb4 | 243 | | Yes | 8 | | utf8mb4_german2_ci | utf8mb4 | 244 | | Yes | 8 | | utf8mb4_croatian_ci | utf8mb4 | 245 | | Yes | 8 | | utf8mb4_unicode_520_ci | utf8mb4 | 246 | | Yes | 8 | | utf8mb4_vietnamese_ci | utf8mb4 | 247 | | Yes | 8 | +------------------------+---------+-----+---------+----------+---------+ 26 rows in set (0.00 sec)

查询PG字符集

在 PostgreSQL 中,可以通过查询 pg_database 系统表来获取数据库的字符集信息。以下是一个 SQL 查询示例,用于获取当前数据库的字符集(编码):

SELECT pg_encoding_to_char(encoding) AS charset
FROM pg_database
WHERE datname = current_database();

这个查询首先从 pg_database 表中获取当前数据库的编码(以整数形式表示),然后使用 pg_encoding_to_char() 函数将编码整数值转换为字符集名称。查询结果将显示当前数据库的字符集名称。

查询PG字符序

在 PostgreSQL 数据库中,你可以通过查询 pg_collation 系统表来查找特定的字符序(collation)。以下是一个 SQL 查询示例,用于查询 “EUC_CN” 字符序的相关信息:

SELECT collname, collcollate, collctype
FROM pg_collation
WHERE collname = 'EUC_CN';

SELECT d.datname as "Name",
       pg_catalog.pg_get_userbyid(d.datdba) as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding",
       d.datcollate as "Collate",
       d.datctype as "Ctype",
       pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges",
       CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
            THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
            ELSE 'No Access'
       END as "Size",
       t.spcname as "Tablespace",
       pg_catalog.shobj_description(d.oid, 'pg_database') as "Description"
FROM pg_catalog.pg_database d
  JOIN pg_catalog.pg_tablespace t on d.dattablespace = t.oid
ORDER BY 1;
                                                             List of databases
   Name    |  Owner  | Encoding | Collate | Ctype |  Access privileges  |  Size   | Tablespace |                Description                 
-----------+---------+----------+---------+-------+---------------------+---------+------------+--------------------------------------------
 lt_test   | lightdb | EUC_CN   | zh_CN   | zh_CN |                     | 14 MB   | pg_default | 
 postgres  | lightdb | EUC_CN   | zh_CN   | zh_CN |                     | 17 MB   | pg_default | default administrative connection database
 template0 | lightdb | EUC_CN   | zh_CN   | zh_CN | =c/lightdb         +| 8217 kB | pg_default | unmodifiable empty database
           |         |          |         |       | lightdb=CTc/lightdb |         |            | 
 template1 | lightdb | EUC_CN   | zh_CN   | zh_CN | =c/lightdb         +| 14 MB   | pg_default | default template for new databases
           |         |          |         |       | lightdb=CTc/lightdb |         |            | 
(4 rows)

这个查询从 pg_collation 表中获取与 “EUC_CN” 字符序相关的信息,包括名称(collname)、排序规则(collcollate)和字符集(collctype)。

要执行这个查询,你可以使用 psql 命令行工具或其他 PostgreSQL 客户端。如果你使用 psql,请按照以下步骤操作:

打开命令行或终端。
连接到 PostgreSQL 数据库,使用如下命令:

psql -U your_username -d your_database_name

在 psql 提示符下,粘贴上述 SQL 查询,然后按 Enter 键执行。你将看到与 “EUC_CN” 字符序相关的信息作为查询结果。
请注意,PostgreSQL 数据库可能不包含 “EUC_CN” 字符序。这取决于你的 PostgreSQL 安装和配置。如果你需要使用 “EUC_CN” 字符序,你可能需要重新编译 PostgreSQL 并添加对该字符集的支持。具体操作步骤和要求可能因操作系统和 PostgreSQL 版本而异。在尝试这种操作之前,请确保了解相关的技术细节和注意事项。

常见错误

ERROR: invalid byte sequence for encoding "EUC_CN": Oxe5 0x88

这个错误信息表明,当尝试将数据插入 PostgreSQL 数据库时,遇到了无效的字节序列,该字节序列无法用 “EUC_CN” 字符集进行编码。在这个错误信息中,无效的字节序列是:0xe5 0x88。

在处理这种问题时,你可以尝试以下几种方法:

检查数据源:确保数据源中的字符编码与数据库中的字符编码设置相匹配。在这种情况下,你应该检查数据是否采用 “EUC_CN” 编码。如果不是,你需要将其转换为 “EUC_CN” 编码,或更改数据库的字符集设置以匹配数据源的编码。

更改数据库字符集:你可以更改数据库的字符集设置,以便使用与数据源相匹配的字符集。通常情况下,建议使用 “UTF8” 编码,因为它支持多种字符集,并具有较好的兼容性。要更改数据库字符集,可以使用以下 SQL 语句:

ALTER DATABASE your_database_name SET client_encoding = 'UTF8';

转换客户端字符集:在连接到 PostgreSQL 数据库时,确保客户端使用与数据库相同的字符集。例如,如果你使用的是 “psql” 客户端,可以通过以下命令设置客户端字符集:

psql -U your_username -d your_database_name --set=client_encoding=UTF8

检查应用程序代码:如果你在应用程序中处理字符编码,确保正确处理编码转换。在很多编程语言中,都提供了相应的库或函数,用于处理字符编码问题。
尝试上述方法之一,应该可以帮助你解决遇到的编码问题。如果问题仍然存在,请提供更多详细信息,以便我们能更好地帮助你解决问题。

ltsql:create_lightdb.sql:9693: ERROR:  character with byte sequence 0xe7 0xb6 0xb2 in encoding "UTF8" has no equivalent in encoding "EUC_CN"
ltsql:create_lightdb.sql:9694: ERROR:  character with byte sequence 0xe7 0xa2 0xbc in encoding "UTF8" has no equivalent in encoding "EUC_CN"
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论