MySQL的UTF-8字符支持

时间:2016-09-22 14:31:45

标签: mysql utf-8

我得到了这个例外 尝试在MySQL表中插入值时java.sql.SQLException: Incorrect string value: '\xC2\x99 Adm...' for column。我发现 \ xC2 \ x99 映射到U + 0099(或\ u0099)这是一个2字节的字符。从文档中,MySQL的UTF-8支持3字节或更少的字符。我还读到了关于utfmb4,但由于这个字符是2字节并且仍然给出了这个错误,所以问题可能是其他问题。请建议。

3 个答案:

答案 0 :(得分:2)

您似乎正在使用默认排序规则latin1_swedish_ci,而您应该使用utf8_general_ci,因为您打算在列中存储UTF-8数据。检查Character Sets and Collations in MySQL

上的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;