在mysql中保存文本字段时将Utf8字符截断

在mysql中保存文本字段时将Utf8字符截断,mysql,cakephp,utf-8,Mysql,Cakephp,Utf 8,我在一个网站上工作,我们把日语字符保存在一个文本字段中 该表如下所示: | 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` v

我在一个网站上工作,我们把日语字符保存在一个文本字段中

该表如下所示:

| 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、数据库、前缀。

您的数据库和表可能处于latin1默认排序规则下,因此如果数据库配置中没有
'encoding'=>'utf8'
,蛋糕将以latin1与数据库进行对话。UTF到latin1的转码和返回leAVE为数据丢失提供了空间。这不是真正的cake问题


因此,继续并更改与UTF的连接以及数据库中的所有默认排序规则。新保存的数据将显示得很好,对于旧的数据将视情况而定,我不会详细介绍,因为它与上下文无关。

字符集拉丁语1
…从什么时候开始,日语是
拉丁语1
的一部分?那些拉丁语行不是拉丁语toring Japanese characters。只有那些具有校对utf8\u unicode\u ci的字段才是。是的,我知道它们似乎都应该是utf8,但这是针对一个预先存在的网站的,如果可能的话,我希望避免更改数据库设置。(尽管我不相信不这样做就可以修复此错误。)您可能需要在中将数据库连接的编码设置为utf8。默认值通常为拉丁文1。我尝试将“encoding”=>“utf8”添加到数据库配置表中,但检索到的字符看起来像“encoding”我可能需要注意的是,我相信这也是旧版本的cakephp.1.3的一部分。@Kai有可能您的mysql版本很旧,不支持所有类型的unicode。从V5.5开始,支持更多。比如unicode表情符号。