0

我遇到了一些特殊字符的问题。当有人尝试使用例如字母“ö”在我的网站上注册时,我收到以下错误消息:

1366 - Incorrect string value: '\xF6m' for column 'username' at row 1

insert into phpbb3_users (username, username_clean, user_password) values ('Ström', 'Ström', '$H$9iK6K37VoHM//')

我知道字符设置可能是问题所在,当我检查数据库时,我可以看到一些表有排序规则:

latin1_swedish_ci 

并且某些表具有排序规则(例如,在上面的示例中存在问题的表 'phpbb3_users'):

utf8_bin

当我检查我的 MySql 设置时,我发现我有这些混合设置:

| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci 
  1. 你推荐我使用什么字符集?我了解到将 character_set 更改为 utf8mb4 可以解决问题,但是我的 MySql 版本(5.1.4)是否支持呢?
  2. 我应该更改 character_set 吗?在 /etc/my.cnf 和所有表排序规则的所有实例中?

谢谢。

4

1 回答 1

2

你需要:

  1. 的字符集(或表/数据库/服务器的下一个更高的默认字符集)设置为支持您要存储的字符的字符集。如果你想存储“ö”,latin1就可以了。如果您想存储更多“异国情调”字符,utf8这是一个不错的选择,因为它几乎支持所有内容。*请
    注意,排序规则latin1_swedish_ci几乎无关紧要。排序规则来自您选择的字符集,但字符集首先是此处的导入变量。
  2. 连接字符集设置为要发送文本的字符集。如果要将 UTF-8 编码的文本发送到数据库,则需要通过将连接字符集设置为utf8. 这很可能是您的问题所在。如何设置取决于你如何连接到数据库。mysql_set_charsetcharset您的 DSN 连接字符串中的参数或SET NAMES utf8查询即可。
  3. 发送以您在步骤 2 中声明的编码进行编码的文本。

* MySQLutf8不是“真正的”UTF-8,只支持所有 Unicode 的一个子集。utf8mb4是“真正的”UTF-8,支持一切。utf8mb4在 MySQL 5.1 上不可用,只有 5.5+。

有关更多信息,请参阅从头到尾的 UTF-8在 Web 应用程序中从头到尾处理 Unicode每个程序员绝对、肯定需要了解的关于使用文本的编码和字符集的知识。

于 2013-10-15T10:21:59.787 回答