ActiveRecord 在 Ruby 1.9.2-rc1 下以 ASCII-8Bit 返回数据

2024-04-01

进一步说明标题,当从 ActiveRecord 加载数据时,尽管我尽了最大努力强制编码,但编码始终设置为 ASCII-8Bit。我在这里输入了尽可能多的详细信息,以尝试构建一个好的错误报告,有人可以用来帮助我!

该项目使用以下技术:

  • 帕德里诺框架
  • Ruby 1.9.2-rc2(还有 1.9.1 和 1.9.2-preview3)
  • 活动记录
  • MySQL

(完整名单)

$ bundle show | ack '(record|padrino)'
  * activerecord (2.3.8)
  * padrino (0.9.14)
  * padrino-admin (0.9.14)
  * padrino-core (0.9.14)
  * padrino-gen (0.9.14)
  * padrino-helpers (0.9.14)
  * padrino-mailer (0.9.14)

剧集表:

mysql> DESCRIBE `episodes`;
+----------------+--------------+------+-----+---------+----------------+
| Field          | Type         | Null | Key | Default | Extra          |
+----------------+--------------+------+-----+---------+----------------+
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |
| show_id        | int(11)      | YES  |     | NULL    |                |
| season_id      | int(11)      | YES  |     | NULL    |                |
| episode_number | int(11)      | YES  |     | NULL    |                |
| title          | varchar(255) | YES  |     | NULL    |                |
| year           | int(11)      | YES  |     | NULL    |                |
+----------------+--------------+------+-----+---------+----------------+
6 rows in set (0.02 sec)

mysql> SHOW CREATE TABLE episodes;
       Table: episodes
Create Table: CREATE TABLE `episodes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `show_id` int(11) DEFAULT NULL,
  `season_id` int(11) DEFAULT NULL,
  `episode_number` int(11) DEFAULT NULL,
  `title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
  `year` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=74332 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

mysql> SHOW CREATE DATABASE development;
+-------------+--------------------------------------------------------------------------------------------------------+
| Database    | Create Database                                                                                        |
+-------------+--------------------------------------------------------------------------------------------------------+
| development | CREATE DATABASE `development` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */           |
+-------------+--------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

正如你所看到的,数据库当然认为应该是UTF-8;还有数据库适配器:

ActiveRecord::Base.configurations[:development] = {
  :adapter   => 'mysql',
  :encoding  => 'utf8',
  :reconnect => false,
  :database  => "development",
  :pool      => 5,
  :username  => 'root',
  :password  => '',
  :host      => 'localhost',
}

检查活动记录连接时,控制台中会回显这一点:

ruby-1.9.2-rc1 > ActiveRecord::Base.connection
  DEBUG - [06/Jul/2010 19:24:32] "SQL (0.1ms)   SET NAMES 'utf8'"
  DEBUG - [06/Jul/2010 19:24:32] "SQL (0.1ms)   SET SQL_AUTO_IS_NULL=0"
 => #<ActiveRecord::ConnectionAdapters::MysqlAdapter:0x0000010936fa88 @logger=#<Padrino::Logger:0x00000101587198 @buffer=[], @auto_flush=true, @level=0, @log=#<IO:<STDOUT>>, @mutex=#<Mutex:0x00000101587148>, @format_datetime="%d/%b/%Y %H:%M:%S", @format_message="%s - [%s] \"%s\"">, @connection=#<Mysql:0x0000010936fad8>, @runtime=0.2608299255371094, @last_verification=0, @query_cache_enabled=false, @config={:adapter=>"mysql", :encoding=>"utf8", :reconnect=>false, :database=>"development", :pool=>5, :username=>"root", :password=>"", :host=>"localhost"}, @connection_options=["localhost", "root", "", "development", nil, nil, 131072], @quoted_table_names={}, @quoted_column_names={}> 

ruby-1.9.2-rc1 > ActiveRecord::Base.connection.encoding

Ruby 应该懂这种语言,这是我的$ locale

LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.utf-8"
LC_CTYPE="en_GB.utf-8"
LC_MESSAGES="en_GB.utf-8"
LC_MONETARY="en_GB.utf-8"
LC_NUMERIC="en_GB.utf-8"
LC_TIME="en_GB.utf-8"
LC_ALL=

虽然 Ruby 没有设置Encoding.default_internal:

$ irb --simple-prompt
ruby-1.9.2-rc1 > Encoding.default_internal
 => nil 

我在我的应用程序中添加了一个片段config/boot.rb看起来像这样:

if Kernel.const_defined?("Encoding") and Encoding.respond_to?(:find) and Encoding.respond_to?(:default_internal)
  Encoding.default_internal = Encoding.find('UTF-8')
end

这完全符合您的预期……但这是一种黑客行为,并不能解决问题。

这是问题的现场输出:

ruby-1.9.2-rc1 > e = Episode.new
  DEBUG - [06/Jul/2010 19:29:14] "SQL (0.1ms)   SET NAMES 'utf8'"
  DEBUG - [06/Jul/2010 19:29:14] "SQL (0.1ms)   SET SQL_AUTO_IS_NULL=0"
  DEBUG - [06/Jul/2010 19:29:14] "Episode Columns (0.8ms)   SHOW FIELDS FROM `episodes`"
 => #<Episode id: nil, show_id: nil, season_id: nil, episode_number: nil, title: nil, year: nil> 
ruby-1.9.2-rc1 > e.title
 => nil
ruby-1.9.2-rc1 > nt = "New Title"
 => "New Title" 
ruby-1.9.2-rc1 > nt.encoding
 => #<Encoding:UTF-8> 
ruby-1.9.2-rc1 > e.title = nt
 => "New Title" 
ruby-1.9.2-rc1 > e.title.encoding
 => #<Encoding:UTF-8> 
ruby-1.9.2-rc1 > e.save
  DEBUG - [06/Jul/2010 19:29:48] "SQL (0.1ms)   BEGIN"
  DEBUG - [06/Jul/2010 19:29:48] "Episode Create (0.2ms)   INSERT INTO `episodes` (`show_id`, `season_id`, `episode_number`, `title`, `year`) VALUES(NULL, NULL, NULL, 'New Title', NULL)"
  DEBUG - [06/Jul/2010 19:29:48] "SQL (0.4ms)   COMMIT"
 => true 
ruby-1.9.2-rc1 > Episode.find_by_title(nt).title.encoding
  DEBUG - [06/Jul/2010 19:30:04] "Episode Load (29.5ms)   SELECT * FROM `episodes` WHERE (`episodes`.`title` = 'New Title') LIMIT 1"
 => #<Encoding:ASCII-8BIT> 
ruby-1.9.2-rc1 > 

我通过重写访问器并将它们重新定义为:

class Episode 
  # ...
  def title
    title.encode!
  end
  # ...
end

Where encode!被定义为1.9 的 API 文档中 http://ruby-doc.org/ruby-1.9/classes/String.html#M000554- 在这里引用它“不带选项返回 str 转码为 Encoding.default_internal 的副本。”

虽然我的解决方法是成功的,但我更希望数据库中出现 UTF-8,这就是我的代码似乎表明的情况。


您可能需要 ruby​​-mysql gem,它在 1.9 中支持编码,而不是更常见的 mysql gem,后者不支持编码。看my blog http://rvdh.de/blog/2010/04/03/pro-tip-using-mysql-with-rails-3-0-0-beta2-and-ruby-1-9-2/了解详情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ActiveRecord 在 Ruby 1.9.2-rc1 下以 ASCII-8Bit 返回数据 的相关文章

  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • 如何删除 MySQL 数据库?

    你可能从我的上一个问题中注意到一个问题引发了更多的问题 在 MySQL 监视器中阅读 MySQL 手册 https stackoverflow com questions 1081399 我的数据库现在无法使用 部分原因是我想破坏东西并且无
  • Rails 3.2:用 json 序列化中的空字符串替换 null 值

    我正在使用 Rails 3 2序列化 http www simonecarletti com blog 2010 04 inside ruby on rails serializing ruby objects with json 将 ru
  • R在Windows平台Rstudio上打印data.frames中的UTF-8代码

    当数据框中存在UTF 8字符时 将无法正常显示 例如 以下内容是正确的 gt U6731 1 朱 但是当我将其放入数据框中并打印出来时 它是 gt data frame x U6731 x 1
  • MySQL:如何仅获取正值的平均值?

    假设我有 INT 列 并且我使用 1 来表示插入时没有可用数据 我想获得该列中所有 0 或更大值的平均值 这可能吗 Thanks 我忘了提及 我正在与其他 AVG 一起执行此操作 因此从选项卡中选择 avg a avg b avg d 所以
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 针对约 225 万行的单表选择查询的优化技术?

    我有一个在 InnoDB 引擎上运行的 MySQL 表 名为squares大约有 2 250 000 行 表结构如下 squares square id int 7 unsigned NOT NULL ref coord lat doubl
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • MySQL 概念:会话与连接

    我对 MySQL 的概念有点困惑 会话与连接 当谈论连接到 MySQL 时 我们使用连接术语 连接池等 然而在 MySQL 在线文档中 http dev mysql com doc refman 4 1 en server system v
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • sqlite3-ruby gem:无法构建 gem 本机扩展

    Update 看看这个后续问题 Windows 上的 Gem 更新 它坏了吗 https stackoverflow com questions 134581 gem update on windows is it broken 在 Win
  • mysql 如何将 varchar(10) 转换为 TIMESTAMP?

    我已将所有日期存储到数据库中varchar 10 现在我想将它们转换为 TIMESTAMP 当我运行sql时 ALTER TABLE demo3 CHANGE date date TIMESTAMP NOT NULL 它提醒 1292 In
  • 如何在 mongoid 中使用 or 条件进行查询

    如何在 Mongoid 中使用 or 条件进行查询 这是 OR 在 mongoid 中查询 如果你想要像下面这样的查询 select from user where id 10 or name hitesh 在带有 mongoid 的 Ra
  • MySQL NOT IN 来自同一个表中的另一列

    我想运行 mysql 查询来选择表中的所有行films其中的值title该列不存在于另一列的所有值中的任何位置 collection 这是我的表格的简化版本 其中包含内容 mysql gt select from films id titl
  • 通过 ruby​​ 进程共享变量

    我正在编写一个 gem 其中我必须分叉两个进程来启动两个 webrick 服务器 我想通过基类的类方法启动该服务器 因为应该只运行这两个服务器 而不是多个服务器 在运行时 我想调用这两台服务器上的一些方法来更改变量 我的问题是 我无法通过基
  • ruby rspec 不能与 simplecov 一起使用

    我安装了 simplecov gem 并添加了 require simplecov SimpleCov start 到spec helper rb文件 现在如果我在some file spec rb文件中包含spec helper rb并尝
  • ruby 字符串到哈希值的转换

    我有一个这样的字符串 str uu p xx m yy n zz m 我想知道如何将给定的字符串转换为哈希值 即我的实际要求是 有多少个值 符号之前 有m n和p 我不需要计数 我需要一个精确的值 这样输出效果会更好 m gt xx zz
  • 在 MySQL 数据库中保持 TEXT 字段唯一的最佳方法

    我想让 TEXT 字段的值在我的 MySQL 表中唯一 经过小型研究 我发现由于性能问题 每个人都不鼓励在 TEXT 字段上使用 UNIQUE INDEX 我现在想用的是 1 创建另一个字段来包含 TEXT 值的哈希值 md5 text v
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for

随机推荐

  • MongoDb 解释失败:“未知的顶级运算符:$query”

    我试图从非常简单的查询中获得解释 它使用具有以下架构的帖子集合 gt db posts findOne id ObjectId 55236e6182bf196454a952b6 Content wuOfCjKborHcxkoyXzXiW C
  • Mysql CASE WHEN JOIN 语句错误

    Mysql查询 SELECT FROM pet info LEFT JOIN lostpets ON pet info id lostpets petid LEFT JOIN pet images ON pet info id pet im
  • 页面加载后部分渲染

    我有一个包含一些用户控件的页面 我想在回发后加载这些用户控件 就像 ajax 渲染一样 每个用户控件都显示数据库中的列表 我不希望用户在服务器代码构建响应时等待 我认为如果为用户显示页面并且在通过 ajax 请求加载用户控件之后 这将很有用
  • 如何在未来取消时终止 Callable 中的 CXF Web 服务调用

    Edit 这个问题现在已经经历了几次迭代 所以请随意查看修订版本 以了解有关历史和尝试过的事情的一些背景信息 我将 CompletionService 与 ExecutorService 和 Callable 一起使用 通过 CXF 生成的
  • 包含 jQuery 会导致标准 JavaScript 停止运行?

    我正在开始使用 jQuery 我一直在尝试将它与一些预先存在的 JavaScript 代码混合 这样我就不必重写所有内容 我读过很多地方都说这是完全可行的 然而 每当我包含任何 jQuery 行时 标准 JavaScript 就会停止运行
  • RubyKoans:破损的公案?

    可能是业余爱好者的标志 我想知道问题是否出在公案 而不是我 但是 考虑一下这个公案 def test calling global methods without parentheses result my global method 2
  • 取消 ChangeNotifier 内的 Firebase 监听器

    当我尝试取消 Firestore 侦听器时ProductsService cancel 我收到错误 错误 flutter lib ui ui dart state cc 209 未处理的异常 LateInitializationError
  • JSF 2.0 validateRegex 带有自己的验证器消息

    我有一个与此类似的代码
  • 控制 Akka 中消耗大量内存的 actor 的生成

    我使用 akka 的 actor 模型构建了一个分布式流机器学习模型 通过向 Actor 发送训练实例 训练数据 来异步训练模型 对这些数据的训练会占用计算时间并改变参与者的状态 目前我正在使用历史数据来训练模型 我想运行一堆不同配置的模型
  • 如何用时刻设置时区?

    我正在使用 moment 来获取服务器时间 moment tz setDefault Asia Kolkata var now new Date var p date moment tz now zone format 插入时间 p dat
  • 在 DevExpress 中计算 ASPxGridview 列

    我有一个ASPxGridview 通常是 21 列 但我只想要处理 4 列 每列都有一个十进制值 MV EDDIE列为空 我想要的是 以编程方式计算 MV EDDIE列是RISK EUR IPOTEK MV BERND 只有在GroupSu
  • Spring 3.1 @Cacheable - 方法仍然执行

    我正在尝试按照解释实现 Spring 3 1 缓存here http www javacodegeeks com 2011 02 spring 31 cache abstraction tutorial html and here http
  • 带条件的 foreach 循环

    我可以用多个条件进行循环 如下所示 for int i 0 condition1 condition2 conditionN i 有没有办法使用 foreach 来做到这一点 foreach var i in arr and while c
  • 入口点不能用“async”修饰符标记

    我从下面复制了代码this http blogs msdn com b csharpfaq archive 2012 06 26 understanding a simple async program aspx链接 但是当我编译这段代码时
  • JQuery,分层表分页

    多次询问分层表和表分页 但我正在寻找他们两个 我已经在我的应用程序中使用 JQuery 因此使用相同的插件将会很有用 但我愿意接受任何建议 目前 我设法使用一些 jQuery 插件来显示分层数据 并添加了我自己的分页方法 但它还不够 我正在
  • 使用 mysql-server docker 容器在多个服务器上创建 MySQL 集群

    我正在尝试使用以下命令创建一个包含 3 个节点的 MySQL 集群mysql 服务器 https hub docker com r mysql mysql server 码头集装箱 I have 3个独立的云实例并且 docker 已在所有
  • Kafka Connect - 删除带有配置的连接器?

    我知道如何删除 Kafka 连接器 如此处所述Kafka Connect 如何删除连接器 https stackoverflow com questions 48947250 kafka connect how to delete a co
  • Ruby:#map 对于 bang 方法通常没有意义,是吗?

    这个问题的灵感来自于这个问题 Ruby 为什么这种使用地图的方式会抛出错误 https stackoverflow com questions 41853364 ruby why does this way of using map thr
  • 收到 ValueError: invalidliteral for int() with base 10: '' 错误并且不知道为什么

    我知道以前曾问过这个问题 但就我的情况而言 我似乎无法弄清楚为什么会抛出这个问题 当我尝试运行计算时 控制台出现以下错误 ValueError invalid literal for int with base 10 它说它来自 File
  • ActiveRecord 在 Ruby 1.9.2-rc1 下以 ASCII-8Bit 返回数据

    进一步说明标题 当从 ActiveRecord 加载数据时 尽管我尽了最大努力强制编码 但编码始终设置为 ASCII 8Bit 我在这里输入了尽可能多的详细信息 以尝试构建一个好的错误报告 有人可以用来帮助我 该项目使用以下技术 帕德里诺框