【问题标题】:Utf8 characters cut off when saving text field in mysql在 mysql 中保存文本字段时 Utf8 字符被截断
【发布时间】: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 的行并不意味着存储日文字符。只有那些具有 collat​​e 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

标签: mysql cakephp utf-8


【解决方案1】:

您的数据库和表可能在 latin1 下默认排序规则,因此如果您的数据库配置中没有 'encoding' => 'utf8',蛋糕将与 latin1 中的数据库通信。将 UTF 转码为 latin1 并返回为数据丢失留下了空间。这不是蛋糕的问题。

所以继续将连接更改为 UTF 以及数据库中的所有默认排序规则。新保存的数据会很好显示,对于旧的则取决于它,我不会详细说明,因为它脱离了上下文。

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 2011-08-11
    • 2012-01-19
    • 2020-09-03
    • 1970-01-01
    • 2017-09-05
    相关资源
    最近更新 更多