我想使用ruby来读取/插入数据到mysql数据库,数据由php代码保存。当我阅读中文数据时,它看起来不正确。它看起来像刘佳
。但是在php页面中,它正确地将中文数据显示为刘佳
。
我确认数据库使用utf-8字符集(CHARSET=utf8 COLLATE=utf8_unicode_ci
)。
我的红宝石代码
require 'active_record'
class Student < ActiveRecord::Base
end
ActiveRecord::Base.establish_connection(
adapter: 'mysql2',
host: 'xxxx',
username: 'xxxx',
password: 'xxxx',
database: 'xxx_db',
encoding: 'utf8'
)
puts Student.first.name
输出未知字符串"刘佳"
。
如何正确阅读中文数据并将新的中文记录保存到数据库?
答案 0 :(得分:0)
puts Student.first.name
It outputs an unknown string "刘佳".
我相信这是因为你用来查看ruby程序输出的任何设备(一个终端窗口?)都没有设置为“UTF-8”(请参阅下面有关如何检查)。
据我所知,你做的一切都是正确的:
mysql docs:(http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html)
指定每个数据库的字符设置。要创建这样的数据库 它的表将使用给定的默认字符集和排序规则 对于数据存储,请使用如下的CREATE DATABASE语句:
CREATE DATABASE mydb DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
在数据库中创建的表将使用utf8和utf8_general_ci 任何字符列的默认值。
使用数据库的应用程序也应该配置它们 每次连接时连接到服务器。这可以通过 连接后执行SET NAMES'utf8'语句。该声明 无论连接方法如何都可以使用:mysql客户端,PHP 脚本,等等。
rails docs:(http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html)
ActiveRecord :: Base.establish_connection()的所有选项如下(请注意:编码的说明):
Options:
:host - Defaults to “localhost”.
:port - Defaults to 3306.
:socket - Defaults to “/tmp/mysql.sock”.
:username - Defaults to “root”
:password - Defaults to nothing.
:database - The name of the database. No default, must be provided.
:encoding - (Optional) Sets the client encoding by executing
“SET NAMES <encoding>” after connection.
:reconnect - Defaults to false (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html).
:strict - Defaults to true. Enable STRICT_ALL_TABLES. (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html)
:variables - (Optional) A hash session variables to send as `SET @@SESSION.key = value` on each database connection. Use the value `:default` to set a variable to its DEFAULT value. (See MySQL documentation: dev.mysql.com/doc/refman/5.0/en/set-statement.html).
:sslca - Necessary to use MySQL with an SSL connection.
:sslkey - Necessary to use MySQL with an SSL connection.
:sslcert - Necessary to use MySQL with an SSL connection.
:sslcapath - Necessary to use MySQL with an SSL connection.
:sslcipher - Necessary to use MySQL with an SSL connection.
(我很难找到这些,所以我将所有这些发布给未来的谷歌搜索者。)
并且,当我在终端窗口中运行以下程序时,例如:
$ r 1.rb
我的终端窗口设置为UTF-8:
~/ruby_programs$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=
...
# encoding: UTF-8
require 'active_record'
require 'mysql2'
class Student < ActiveRecord::Base
end
ActiveRecord::Base.establish_connection(
adapter: 'mysql2',
#host: 'localhost', #this is the default
#username: 'root', #this is the default
#password: '', #this is the default
database: 'mydb2',
encoding: 'utf8'
)
#Insert a record in the db (It shouldn't matter whether a php or a ruby program writes to the database.)
Student.create(
name: "\u732a", #Because of the comment at top of the program, this
#string will be encoded in UTF-8
info: "a pig" #..so will this one.
)
name = Student.first.name
puts name
name.each_byte{|b| printf "%x \n", b}
puts
...我看到的输出是我的终端窗口中的中文字符,与'pig'的中文字符完全匹配,后跟:
e7
8c
aa
如果你看这里:http://www.fileformat.info/info/unicode/char/732a/index.html,那些字节组成了unicode整数\u732a
的UTF-8编码,它代表中文的'pig',这就是字符串中的字符串被插入数据库。
在任何情况下,你应该运行我的程序,如果你得到同样的错误,那么它将证明这是你终端的编码问题。