【发布时间】:2013-07-12 21:31:51
【问题描述】:
我正在开发一个网站,我们将日文字符保存在文本字段中。
表格如下所示:
| contactlogs | CREATE TABLE `contactlogs` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`contact_email` varchar(128) CHARACTER SET latin1 NOT NULL,
`name` varchar(128) CHARACTER SET latin1 DEFAULT NULL,
`company_name` varchar(128) CHARACTER SET latin1 DEFAULT NULL,
`email` varchar(128) CHARACTER SET latin1 DEFAULT NULL,
`telephone` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
`fax` varchar(30) CHARACTER SET latin1 DEFAULT NULL,
`subject` text COLLATE utf8_unicode_ci NOT NULL,
`message` text COLLATE utf8_unicode_ci NOT NULL,
`created` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
当我检索已保存的数据时,消息字段经常被截断,末尾有一个垃圾字符(我假设是因为它可能没有保存最后一个字符的所有数据。
网站本身在 cakephp 中。只需执行 $this->model->save($data) 即可保存数据(没有更改任何保存方式,模型本身为空)。没有特殊的数据库设置。只需设置主机、登录、持久性 => false、驱动程序 => mysql、数据库、前缀。
【问题讨论】:
-
CHARACTER SET latin1... 从什么时候开始latin1的日语部分? -
那些 latin1 的行并不意味着存储日文字符。只有那些具有 collate utf8_unicode_ci 的字段是。是的,我知道它们似乎都应该是 utf8,但它适用于预先存在的网站,如果可能的话,我想避免更改数据库设置。 (虽然我完全不相信不这样做就可以修复这个错误。)
-
您可能需要在configuration 中将数据库连接的编码设置为utf8。默认值通常是 latin1。
-
我尝试将 'encoding' => 'utf8' 添加到 DATABASE_CONFIG 表中,但检索到的字符看起来像ã‚ã„” 我可能应该注意到,这也适用于 cakephp 的旧版本。 1.3,我相信。
-
@Kai 你的mysql版本可能太旧了,不支持各种unicode。从 V5.5 开始支持更多。像 unicode 表情符号。 dev.mysql.com/doc/refman/5.5/en/charset-unicode.html