CakePHPでVARCHAR(256以上)の値を取得すると255byteにカットされてしまう
- 環境
- CakePHP1.2.8
- SQL Server 2005
- VARCHAR(512)
上記の環境で,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 |