为了让网站接受用户提交的可能不是英文(例如日文)的内容并将其保存到数据库中,对所有新内容进行 utf8_encode 并在以后检索时用户 utf8_decode 是否符合我的最佳利益?
更多信息:我正在使用学说,尝试将 Unicode 字符保存或选择到 MySQL 数据库时出现错误:
SQLSTATE [HY000]:一般错误:1267 排序规则(latin1_swedish_ci,IMPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合操作'='
为了让网站接受用户提交的可能不是英文(例如日文)的内容并将其保存到数据库中,对所有新内容进行 utf8_encode 并在以后检索时用户 utf8_decode 是否符合我的最佳利益?
更多信息:我正在使用学说,尝试将 Unicode 字符保存或选择到 MySQL 数据库时出现错误:
SQLSTATE [HY000]:一般错误:1267 排序规则(latin1_swedish_ci,IMPLICIT)和(utf8_general_ci,COERCIBLE)的非法混合操作'='
您不需要使用编码功能。您需要做的是确保您是端到端的 UTF8。看起来您的数据库可能正在使用 latin1 编码和排序规则。您与数据库的连接也需要是 UTF8。有时这只是在建立连接后立即执行 SET NAMES UTF8 查询的问题。
在 mysql 中运行此命令可能会解决您在上面看到的错误,但您仍然需要端到端 UTF8。然后你不需要对你的数据做任何特别的事情。
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
布伦特是对的。它需要端到端。这是我的清单:
Apache config:
AddDefaultCharset UTF-8
AddCharset UTF-8 .utf8
php.ini:
default_charset = "utf-8"
MySQL:
ALTER DATABASE DEFAULT CHARACTER SET utf8;
ALTER TABLE SomeTableName DEFAULT CHARACTER SET utf8;
PHP/HTML:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
…
<form … <input type="text" name="some_field" value="<?php echo htmlspecialchars($row['some_field'], ENT_COMPAT, 'UTF-8'); ?>"…
This last one seems the most important. Call this function immediately after the mysql_connect() call:
mysql_query("SET NAMES 'utf8'");