我有一个术语数据库,由一组用户添加到其中,并由另一组用户查询。
\n\n当人们在数据库中查询表情符号并且我的 React 应用程序会抛出错误(奇怪的是 CORS 错误,但这是一个不同的问题)时,我遇到了问题。我最终通过将表的字符集更改为utf8mb4
带有utf8mb4_unicode_ci
排序规则来解决这个问题。
现在,我在添加新术语时遇到错误,例如,“beyonc\xc3\xa9”的重复行已存在。但是,当我在数据库中查询“beyonc\xc3\xa9”时,它返回其中包含“beyonce”的行。是否有字符集和排序规则的组合可以正确处理这个问题?
\n\n我的数据库是在 Amazon RDS 上运行的 MySQL 5.6.40。
\n这是 aix 6100-02 上的 Oracle 10gr2
问题是我没有看到 Oracle 的 € 标志。
这是查看问题的简单方法:
SQL> insert into prueba values ('€');
SQL> commit;
SQL> select * from prueba;
EURO
------------------------------------------------------------
¿
SQL>
Run Code Online (Sandbox Code Playgroud)
这是我已经做过的测试。
我从外壳中看到它:
oracle@krats:/u01#perl -Mcharnames=:full -CS -wle 'print "\N{EURO SIGN}"'
€
oracle@krats:/u01#
Run Code Online (Sandbox Code Playgroud)
但我没有从 sql 中看到它:
SQL> select chr(128) from dual;
C
-
SQL>
Run Code Online (Sandbox Code Playgroud)
该数据库具有以下 NLS_SESSION_PARAMETERS;
SQL> SELECT * FROM NLS_SESSION_PARAMETERS;
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_LANGUAGE SPANISH
NLS_TERRITORY SPAIN
NLS_CURRENCY ¿
NLS_ISO_CURRENCY SPAIN
NLS_NUMERIC_CHARACTERS ,.
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD/MM/RR
NLS_DATE_LANGUAGE SPANISH
NLS_SORT …
Run Code Online (Sandbox Code Playgroud) 我尝试collation_name
在sys.databases
. 我正在尝试将 'SQL_Latin1_General_CP1_CS_AS' 更改为 'SQL_Latin1_General_CP1_CI_AS' 以禁用表中的区分大小写。
update d set d.collation_name='SQL_Latin1_General_CP1_CI_AS'
--SELECT name, collation_name
FROM sys.databases d
WHERE name = 'db_name'
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
不允许消息 259,级别 16,状态 1,第 1 行对系统目录进行临时更新。
提示:要使用 UTF-8 节省空间,请使用 VARCHAR 而不是 CHAR。否则,MySQL 必须为 CHAR CHARACTER SET utf8 列中的每个字符保留三个字节,因为这是可能的最大长度。例如,MySQL 必须为 CHAR(10) CHARACTER SET utf8 列保留 30 个字节。
来自:http : //dev.mysql.com/doc/refman/5.7/en/charset-unicode-utf8.html
这是否意味着如果我在 mysql 中使用除char utf8列之外的varchar utf8列,mysql 将使用 1 个字节的拉丁语和 3 个字节的 CJK(Chinese?japanese?Korean) 物理存储字符?