我真的很纠结如何处理这个。在过去的 10 年里,我一直忍受着这个问题,但我认为是时候决定处理这个问题的正确方法了。
根据 Internet,MySQL 不支持 native 数据类型,这就是为什么每当我选择“BOOLEAN”时,我都会看到该列最终为 tinyint(1)。
将数据存储为具有 1 或 0 值的 tinyint 没有问题,但是我确实有一个问题,当我从数据库中使用此列选择许多行时,我得到一个字符串“1”或“0"而不是 PHP native bool true/false。 PHP 仍然可以将此变量作为 bool 值处理,因为它似乎自动知道每当我执行 == 0 或 == 1 或什至 == '0' 或 == '1' 时我想要它做什么,如果我真的感觉可以了。
所以,我开始,获取这些数据并将其运行到 PHP 的 json_encode 函数中,并在我的 Backbone/Handlebars 实现进行 ajax 调用时输出它,并获得一个漂亮的 JSON 对象(通常使用许多行的数据)与此:{"myVariable":"1"} 或此 {"myVariable":"0"}。
我相信您会看到想要在 Handlebars.js 中做这样的事情的问题:
{{#if myVariable}}
Do this
{{else}}
Do that
{{/if}}
现在,我真正不想做的是这样的事情:
<?php
for($i = 0; $i < count($recordSet); $i++) {
$recordSet[$i]['myVariable'] = (bool)$recordSet[$i]['myVariable'];
}
?>
因为我正在构建的应用程序在数据库中有数千列,所以我不能(或者只需要)为我想要的每一列运行上面的代码,就像我的 javascript 中的 bool 一样。我真的不想这样做(尽管这可能是最简单的)
Handlebars.registerHelper('ifTrue', function(a, b) {
// Cast the compared value to a bool and then run a regular handlebars #if statement
});
有没有更好的方法?我正在使用代码点火器...是否可以通过某种方式修改数据库类以检测 tinyint(1) 列并自动将其转换为 bool 值,然后一直执行此操作直到 MySQL 支持真正的 bool 值列?我知道他们正在计划,但是......
最佳答案
请记住,默认情况下,PHP/MySQL 驱动程序返回的列值只是字符串(即无类型的字节数组)。这个简短的片段演示了这一点:
// mysqli driver
$c = mysqli_connect ($host, $user, $pass, $dbname);
$r = mysqli_query($c, 'SELECT * FROM foo');
$f = mysqli_fetch_array($r);
foreach ($f as $k => $v) {
echo "$k => $v [" . gettype($v) . ']' . PHP_EOL;
}
// PDO
$c = new PDO("mysql:dbname=$dbname;host=$host", $user, $pass);
$r = $c->query('SELECT * FROM foo');
$f = $r->fetch();
foreach ($f as $k => $v) {
echo "$k => $v [" . gettype($v) . ']' . PHP_EOL;
}
“默认”,因为可以为驱动程序提供一个映射,以便它可以将这些字符串转换为 native PHP 类型。为此,mysqli 有 mysqli_result::fetch_object() , PDO 有 PDOStatement::fetchObject() .
虽然可以从其元数据或什至从表定义中检索实际的列类型,但在典型情况下,客户端应用程序会提前知道。
底线是:您确实想要这样做(或类似的事情):
$recordSet[$i]['myBoolColumn'] = (bool)$recordSet[$i]['myBoolColumn'];
...因为事实上你也应该这样做:
$recordSet[$i]['myIntColumn'] = (int)$recordSet[$i]['myIntColumn'];
但是 PHP 在输入方面非常宽松,毕竟我不会太担心这一点。
关于php - MySQL bool 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16021373/
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom
希望我没有误解“ducktyping”的含义,但从我读到的内容来看,这意味着我应该根据对象如何响应方法而不是它是什么类型/类来编写代码。代码如下:defconvert_hash(hash)ifhash.keys.all?{|k|k.is_a?(Integer)}returnhashelsifhash.keys.all?{|k|k.is_a?(Property)}new_hash={}hash.each_pair{|k,v|new_hash[k.id]=v}returnnew_hashelseraise"CustomattributekeysshouldbeID'sorPropertyo
我试图像这样在我的测试用例中执行获取:request.env['CONTENT_TYPE']='application/json'get:index,:application_name=>"Heka"虽然,它失败了:ActionView::MissingTemplate:Missingtemplatealarm_events/indexwith{:handlers=>[:builder,:haml,:erb,:rjs,:rhtml,:rxml],:locale=>[:en,:en],:formats=>[:html]尽管在我的Controller中我有:respond_to:html,
我有代码:classScenedefinitialize(number)@number=numberendattr_reader:numberendscenes=[Scene.new("one"),Scene.new("one"),Scene.new("two"),Scene.new("one")]groups=scenes.inject({})do|new_hash,scene|new_hash[scene.number]=[]ifnew_hash[scene.number].nil?new_hash[scene.number]当我启动它时出现错误:freq.rb:11:in`[]'
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。我来自C、php和bash背景,很容易学习,因为它们都有相同的C结构,我可以将其与我已经知道的联系起来。然后2年前我学了Python并且学得很好,Python对我来说比Ruby更容易学。然后从去年开始,我一直在尝试学习Ruby,然后是Rails,我承认,直到现在我还是学不会,讽刺的是那些打着简单易学的烙印,但是对于我这样一个老练的程序员来说,我只是无法将它