CakePHPでVARCHAR(256以上)の値を取得すると255byteにカットされてしまう

  • 環境

上記の環境で,VARCHAR(512)をSELECTすると255byteでカットされてしまうようです。


以下のファイルを中心に調べてみたのですが,根本に辿り着けずで断念してしまいました。

  • cake\libs\model\datasources\datasource.php
  • cake\libs\model\datasources\dbo_source.php
  • cake\libs\model\datasources\dbo\dbo_mssql.php


cake\libs\model\datasources\dbo\dbo_mssql.phpにそれらしき'255'があったので,書き換えてみるも変化無し。。。

<?php
/**
 * MS SQL column definition
 *
 * @var array
 */
  var $columns = array(
    'primary_key' => array('name' => 'IDENTITY (1, 1) NOT NULL'),
    'string'      => array('name' => 'varchar', 'limit' => '255'),
    'text'        => array('name' => 'text'),
    'integer'     => array('name' => 'int', 'formatter' => 'intval'),
    'float'       => array('name' => 'numeric', 'formatter' => 'floatval'),
    'datetime'    => array('name' => 'datetime', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
    'timestamp'   => array('name' => 'timestamp', 'format' => 'Y-m-d H:i:s', 'formatter' => 'date'),
    'time'        => array('name' => 'datetime', 'format' => 'H:i:s', 'formatter' => 'date'),
    'date'        => array('name' => 'datetime', 'format' => 'Y-m-d', 'formatter' => 'date'),
    'binary'      => array('name' => 'image'),
    'boolean'     => array('name' => 'bit')
  );


今回は根本原因は判りませんでしたが,VARCHAR型で長さが256以上のカラムをTEXT型に変更することで解決しました。
CakePHP1.3にアップデートするや他のDBは試していません。


主要なDBのVARCHARサイズを調べたので参考までに載せておきます。

DB Min Max 出典
SQL Server 2008 R2 1 8,000 char および varchar (Transact-SQL) - SQL Server | Microsoft Docs
MySQL 5.1 0 65,535 http://dev.mysql.com/doc/refman/5.1-olh/ja/char.html
Oracle 11g 1 4,000 Oracleデータ型
PostgreSQL 9.0 1 正の整数 http://www.postgresql.jp/document/9.0/html/datatype-character.html