存在我无法更改字符集的现有数据库/表。这些表使用排序规则“latin1_swedish_ci”,但其中存储了 UTF-8 数据。例如字符串“fußball”(德国足球)被保存为“fuøball”。这是我无法更改的部分。
我的整个脚本在 UTF-8 下工作得很好,它有自己的 UTF-8 表,我使用 PDO(mySQL) 和 UTF-8 连接来查询。但有时我不得不查询一些“旧”latin1 表。有什么“很酷”的方法可以解决这个问题而不是发送 SET NAMES。
这是我在 stackoverflow 上的第一个问题! :-)
最佳答案
实际上很容易认为数据是以一种方式编码的,而实际上它是以另一种方式编码的:这是因为任何直接检索数据的尝试都会导致首先转换为数据库连接的字符集,然后转换为输出介质的字符集——因此您应该首先通过 SELECT BINARY myColumn FROM myTable WHERE ... 验证存储数据的实际编码> 或 SELECT HEX(myColumn) FROM myTable WHERE ...。
一旦您确定您将 UTF-8 编码数据存储在 Windows-1252 编码列中(即您看到 0xc39f,其中字符 ß 是预期的),您真正想要的是从列中删除编码信息,然后告诉 MySQL 数据实际上编码为 UTF-8。如 ALTER TABLE Syntax 下所述:
Warning
The
CONVERT TOoperation converts column values between the character sets. This is not what you want if you have a column in one character set (likelatin1) but the stored values actually use some other, incompatible character set (likeutf8). In this case, you have to do the following for each such column:ALTER TABLE t1 CHANGE c1 c1 BLOB; ALTER TABLE t1 CHANGE c1 c1 TEXT CHARACTER SET utf8;The reason this works is that there is no conversion when you convert to or from
BLOBcolumns.
从此以后,MySQL 将根据需要正确地将所选数据转换为连接字符集的数据。也就是说,如果连接使用 UTF-8,则不需要转换;而使用 Windows-1252 的连接将接收转换为该字符集的字符串。
不仅如此,MySQL 中的字符串比较也将正确执行。例如,如果您当前连接的是 UTF-8 字符集并搜索 'fußball',您将不会得到任何结果;而你会在上面的修改之后。
您提到的必须更改大量遗留脚本的陷阱仅适用于那些遗留脚本使用不正确的连接字符集的情况(例如,告诉 MySQL 他们使用 Windows-1252 而他们实际上正在发送和期望接收 UTF-8 格式的数据)。无论如何,你真的应该解决这个问题,因为它可能会导致 future 的各种恐怖。
关于php - 带有 PDO 的混合 UTF-8 和 latin1 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13623036/
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做
假设我有一个类A,里面有一些方法。假设stringmethodName是这些方法之一,我已经知道我想给它什么参数。它们在散列中{'param1'=>value1,'param2'=>value2}所以我有:params={'param1'=>value1,'param2'=>value2}a=A.new()a.send(methodName,value1,value2)#callmethodnamewithbothparams我希望能够通过传递我的哈希以某种方式调用该方法。这可能吗? 最佳答案 确保methodName是一个符号,而
当我进入Rails控制台时,我已将pry设置为加载代替irb。我找不到该页面或不记得如何将其恢复为默认行为,因为它似乎干扰了我的Rubymine调试器。有什么建议吗? 最佳答案 我刚发现问题,pry-railsgem。忘记了它的目的是让“railsconsole”打开pry。 关于ruby-on-rails-带有Pry的Rails控制台,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/question
我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到
我有一个模块:moduleMyModuledefdo_something#...endend由类使用如下:classMyCommandextendMyModuledefself.execute#...do_somethingendend如何验证MyCommand.execute调用了do_something?我已经尝试使用mocha进行部分模拟,但是当未调用do_something时它不会失败:it"callsdo_something"doMyCommand.stubs(:do_something)MyCommand.executeend 最佳答案
我在一个简单的RailsAPI中有以下Controller代码:classApi::V1::AccountsControllerehead:not_foundendendend问题在于,生成的json具有以下格式:{id:2,name:'Simpleaccount',cash_flows:[{id:1,amount:34.3,description:'simpledescription'},{id:2,amount:1.12,description:'otherdescription'}]}我需要我生成的json是camelCase('cashFlows'而不是'cash_flows'
所以我只是对此感到好奇:DataMapper为其模型使用混合classPostincludeDataMapper::Resource虽然active-record使用继承classPost有谁知道为什么DataMapper选择这样做(或者为什么AR选择不这样做)? 最佳答案 它允许您从另一个不是DM类的类继承。它还允许动态地将DM功能添加到类中。这是我正在处理的模块中的类方法:defdatamapper_classklass=self.dupklass.send(:include,DataMapper::Resource)klass
在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para
如何用HAML编写这个ERB:#OR我可以:=some_ruby_code+":"#and=some_ruby_code%br但我不想在这里连接,我想将它写成内联:(=some_ruby_code):#and(=some_ruby_code)%br 最佳答案 =some_ruby_code+":"-#and=some_ruby_code+""编辑1:我不确定您在寻找什么。你想要其中之一吗?==#{some_ruby_code}:-#and==#{some_ruby_code}或==#{some_ruby_code}:-#and=so