从php代码保存的mysql数据库中读取/插入中文数据

时间:2014-06-29 07:10:33

标签: php mysql ruby utf-8

我想使用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

输出未知字符串"刘佳"

如何正确阅读中文数据并将新的中文记录保存到数据库?

1 个答案:

答案 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',这就是字符串中的字符串被插入数据库。

在任何情况下,你应该运行我的程序,如果你得到同样的错误,那么它将证明这是你终端的编码问题。