我正在学习laravel,而且我只是坚持一个简单的过程。我希望表格生成为UTF-8,但varchar和文本字段就像latin-1。
Schema section in guide根本没有帮助。我发现this GitHub entry但它不起作用(抛出我的错误)。
我有这样的架构:
<?php
class Create_Authors_Table {
/**
* Make changes to the database.
*
* @return void
*/
public function up()
{
Schema::create('authors',function($table){
//$table->charset('utf8'); //does not work
//$table->collate('utf8_general_ci'); //does not work
$table->increments('id');
$table->string('name')->charset('utf8'); //adding ->collate('utf8_general_ci') does not work
$table->text('bio')->charset('utf8');
$table->timestamps();
});
}
/**
* Revert the changes to the database.
*
* @return void
*/
public function down()
{
Schema::drop('authors');
}
}
这是SQL输出:
CREATE TABLE IF NOT EXISTS `authors` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(200) NOT NULL,
`bio` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
但这就是我的需要:
CREATE TABLE IF NOT EXISTS `authors` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(200) NOT NULL,
`bio` text NOT NULL,
`created_at` datetime NOT NULL,
`updated_at` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
我甚至将collation
密钥放到我的application / config / database.php
'mysql' => array(
'driver' => 'mysql',
'host' => '',
'database' => '',
'username' => '',
'password' => '',
'charset' => 'utf8',
'collation'=> 'utf8_unicode_ci', //this line was not there out of the box, googling provided me this
'prefix' => '',
),
我缺少什么,我该如何解决这个问题?
谢谢,
答案 0 :(得分:2)
MySQL character sets
已添加对collation
和Laravel 4
的支持。
查看此示例。
答案 1 :(得分:1)
在Laravel 3 master中,似乎没有为单个架构构建实际实现。 (在源代码中找不到任何内容)
我认为您需要手动执行此操作(尝试使用raw query)
答案 2 :(得分:1)
我坚持不懈,我猜Laravel没有办法改变/设置字符集的整理。但是您可以在MySQL服务器的my.ini/my.cnf
中更改charset的默认排序规则!
[mysqld]
#...
collation-server = utf8_unicode_ci
#...
答案 3 :(得分:1)
刚刚解决了它,(使用mysql 5.5(5.5.29))与Linux Mint 13 Mate(基于Ubuntu 12.04 LTS)
我在/etc/mysqld/my.cnf
上添加了这些行[client]
default-character-set = utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
character-set-server = utf8
collation-server = utf8_unicode_ci
这样,SQL查询就可以在shell上运行,但是在laravel或phpmyadmin等上,它们不起作用。所以我这样做了:
我打开了/etc/apache2/conf.d/charset并删除了;从这一行:
AddDefaultCharset UTF-8
然后我重新启动了apache2和mysql,现在它可以正常工作。
后期编辑:That GitHub Core Hack就像一种享受。我最终做到了。
答案 4 :(得分:0)
这是我的解决方案
1.add public $charset;
位于public $engine;
下的laravel / database / schema / table.php中
2.将lavvel / database / schema / grammars / mysql.php中的函数create替换为
public function create(Table $table, Fluent $command)
{
$columns = implode(', ', $this->columns($table));
// First we will generate the base table creation statement. Other than auto
// incrementing keys, no indexes will be created during the first creation
// of the table as they're added in separate commands.
$sql = 'CREATE TABLE '.$this->wrap($table).' ('.$columns.')';
if ( ! is_null($table->engine))
{
$sql .= ' ENGINE = '.$table->engine;
}
if ( ! is_null($table->charset))
{
$sql.="DEFAULT CHARSET=".$table->charset;
}
return $sql;
}
3.现在您可以在迁移php中设置任何字符集,例如$table->charset='utf8';