Ruby on Rails学习笔记(六 神挡杀神佛挡杀佛------数据库字符集问题)
来源:互联网 发布:怎么才能做淘宝直播 编辑:程序博客网 时间:2024/06/04 19:40
遇到了关于字符集的问题
遇到了字符集编码不一致问题,导致数据库不支持中文,原因是这样的
首先,我们安装的mysql默认编码是latin1,尽管我们之前在database.yml中指定了encoding: utf8
书上对这个属性的解释为 : encoding :数据库所采用的字符集编码,默认为utf8
但这个好像没起到作用,如果有人知道这个起什么作用请告诉我,方便我们互相学习
1 mysql默认字符集为latin1而不是utf8
我们之前没有修改mysql的默认字符集,
rake db:charset
这条命令用于检索当前环境下数据库的字符设置,当我们使用命令rake db:create
创建数据库时,rails会自动检索数据库字符集,当然,此时我们的字符集是默认的latin1
2.mysql常识普及
当mysql处于默认配置时,分别执行两此操作
操作一:
drop table tb_tt;CREATE TABLE tb_tt ( id int(11) DEFAULT NULL, ctnr varchar(60) DEFAULT NULL) ENGINE=InnoDB default charset=utf8;insert into tb_tt(id,ctnr) values(1,'新華網');
结果是插入成功
操作二:
drop table tb_tt;CREATE TABLE tb_tt ( id int(11) DEFAULT NULL, ctnr varchar(60) DEFAULT NULL) ENGINE=InnoDB charset=latin1;insert into tb_tt(id,ctnr) values(1,'新華網');
结果是插入失败
我们发现,影响结果的因素是charset这个参数
3. 执行rake db:migrate
时会在数据库中创建表,并指定表的字符集
接下来我们执行了$ rails generate scaffold user name:text password:text
又执行了rake db:migrate
这个时候问题来了,在执行rake db:migrate
之后,打开db—->schema.rb
我们会发现里面放着创建表的代码,比如这一段
create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.text "name" t.text "password" t.datetime "created_at", null: false t.datetime "updated_at", null: false
4.真相浮出水面
终于找到了罪魁祸首,这段创建数据库的代码里的charset参数是latin1 !!!!
我们可以判断出来,这里的charset参数与执行rake db:charset
的返回结果有关系,或者说,这里的参数就算上面这条命令的返回结果
总结一下,由于mysql的默认字符集是latin1,导致rake db:create
创建的数据库字符集是latin1,进而导致rake db:migrate
过程中创建的表的字符集是latin1
数据库的字符设置是这样的
show variables like '%character_set%';+--------------------------+----------------------------+| Variable_name | Value |+--------------------------+----------------------------+| character_set_client | utf8 || character_set_connection | utf8 || character_set_database | latin1 || character_set_filesystem | binary || character_set_results | utf8 || character_set_server | latin1 || character_set_system | utf8 || character_sets_dir | /usr/share/mysql/charsets/ |+--------------------------+----------------------------+
这里每一项都有各自的含义。。
关于字符集的解释,发现一篇很好的博客
关于字符集的相关知识
5.解决问题
1.修改mysql默认字符集为utf8在这里要修改的地方是etc/mysql.cnf打开mysql.cnf,发现里面这样写着
!includedir /etc/mysql/conf.d/!includedir /etc/mysql/mysql.conf.d/
算了,直接说重点 1.mysql/conf.d/mysql.cnf 在[mysql]一句话,如下
[mysql] default-character-set=utf8
2.mysql/mysql.conf.d/mysqld.cnf 在[mysqld]最后一行添加character-set-server=utf8 如下所示
[mysqld] # # * Basic Settings # user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking character-set-server=utf8 # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure.
在修改的时候最好用vi修改,我用gedit修改的被提示编码有问题,后来换成vi修改没有错误提示[参考博客](www.linuxidc.com/Linux/2016-09/135333.htm)再普及以下vi编辑器的使用[vim编辑器的使用](http://www.linuxidc.com/Linux/2013-08/89096.htm)2.重新创建数据库 1.删除数据库`$ rake db:drop:all` 此时再`rake db:charset`发现报错了,因为相关的数据库被删除了,会提示:`Unknown database 'helloworld_development'` 2.创建数据库
rake db:create bundle install rake db:charset
我们会发现返回结果成了utf8
- Ruby on Rails学习笔记(六 神挡杀神佛挡杀佛------数据库字符集问题)
- Ruby on Rails学习笔记(二 Ruby连接mysql数据库)
- Ruby on rails学习笔记
- [Ruby On Rails] Rails 路由学习笔记
- Ruby on Rails学习笔记3-数据库保存session
- Ruby On Rails 学习:使用Redis数据库
- Ruby on Rails学习笔记 (一)
- ruby on rails学习笔记1
- ruby on rails学习笔记(一)
- Ruby on Rails 开发学习笔记 一
- Ruby on Rails 开发学习笔记 二
- Ruby on Rails学习笔记1
- Ruby on Rails学习笔记(二 )
- Ruby on rails学习
- Ruby on Rails学习笔记(三 创建Rails项目)
- Ruby on Rails学习笔记(6)--Ruby中的变量
- Ruby on Rails学习笔记(7)--ruby数据类型/变量
- Ruby on Rails学习笔记(8)--ruby中的方法
- 数据库中的schema
- 0004、node 之静态资源的使用
- C/C++使用libcurl库发送http请求
- Python 3基础教程36-tkinter创建菜单
- 硬币题解
- Ruby on Rails学习笔记(六 神挡杀神佛挡杀佛------数据库字符集问题)
- 运行Tomcat启动项目异常:Java.lang.UnsupportedClassVersionError
- Python闭包之一
- 【计算机视觉】opencv姿态解算7 四大坐标系,摄像机线性模型, 畸变模型
- Hadoop基础教程-第1章 环境安装配置(1.4 CentOS 基本配置)
- spring学习之简介helloword
- 05-树8 File Transfer (25分)
- 欢迎使用CSDN-markdown编辑器
- p1125_floyd