我得到了这个例外
尝试在MySQL表中插入值时java.sql.SQLException: Incorrect string value: '\xC2\x99 Adm...' for column
。我发现 \ xC2 \ x99 映射到U + 0099(或\ u0099)这是一个2字节的字符。从文档中,MySQL的UTF-8支持3字节或更少的字符。我还读到了关于utfmb4,但由于这个字符是2字节并且仍然给出了这个错误,所以问题可能是其他问题。请建议。
答案 0 :(得分:2)
您似乎正在使用默认排序规则latin1_swedish_ci
,而您应该使用utf8_general_ci
,因为您打算在列中存储UTF-8
数据。检查Character Sets and Collations in MySQL
您可以使用ALTER
命令更改归类字符集
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
答案 1 :(得分:1)
字符U+0099(又名'<control>'
)确实可以是encoded in Latin-1 aka ISO-8859-1(更具体地说,它是0x99
),并且您的连接似乎已正确配置为使用UTF-8。
我怀疑问题是MySQL的特点:latin1
does not mean ISO-8859-1
:
mysql> SHOW CHARACTER SET like 'Latin1';
+---------+----------------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+----------------------+-------------------+--------+
| latin1 | cp1252 West European | latin1_swedish_ci | 1 |
+---------+----------------------+-------------------+--------+
1 row in set (0.00 sec)
和Windows-1252 does not have a position for U+0099
:
ISO-8859-1(也称为Latin-1)与Windows-1252(也是 称为CP1252),代码点128-159(0x80-0x9F)除外。 ISO-8859-1在此范围内分配了多个控制代码。 Windows的1252 有几个字符,标点符号,算术和商业符号 分配给这些代码点。
来自MySQL手册中的West European Character Sets:
latin1是默认字符集。 MySQL的latin1与。的相同 Windows cp1252字符集。这意味着它与 官方ISO 8859-1或IANA(互联网号码分配机构) latin1,除了IANA latin1处理0x80之间的代码点 和0x9f为“未定义”,而cp1252,因此MySQL的latin1, 为这些职位分配字符。例如,0x80是欧元 标志。对于cp1252中的“未定义”条目,MySQL将0x81转换为 Unicode 0x0081,0x8d到0x008d,0x8f到0x008f,0x90到0x0090,以及 0x9d到0x009d。
简而言之:您无法使用latin1
列来存储此类字符。由于您已在应用中使用UTF-8,因此应考虑将数据库升级到utf8
,或者更好,utf8mb4
。
答案 2 :(得分:0)
您可以在MySQL数据库架构创建期间添加对UTF-8字符集的支持,因为默认情况下,架构创建有时不使用UTF-8字符集。
CREATE DATABASE dbName
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_general_ci;