我花了几个小时来调试算法并注意到它来自 Doctrine (v2.3.3)。 我正在使用 libpuzzle 来计算图像的哈希值并将此哈希值存储在数据库中。 返回的散列中有特殊字符,显然 Doctrine 不喜欢它。
这是我拥有的那种字符串(~550 个字符):
ÿ�þÿÿþ�þþÿþÿþÿþþ�þÿþÿÿÿ�ÿþþÿþÿ�ÿÿþÿþÿþþÿþþÿÿÿþÿþþþþÿþ�þþþÿ�ÿÿ�ÿÿþ�þÿþÿþÿþÿþþÿþÿÿÿþþÿþþþþÿþþþþ���ÿÿ�ÿ�þþ�þÿÿþþþÿÿþÿþþÿþþþÿþ...
我调查过,发现有人说要在配置中添加字符集,但我已经有了:
# Doctrine Configuration
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
如果我将列的排序规则从 utf8_unicode_ci 更改为 utf8_general_ci 仍然无法正常工作。我还确保默认模式排序规则是 utf8_general_ci。
我尝试了另一个带有特殊字符的字符串:
Test !§$%&/()=? äöü ÄÖÜ :D
此字符串已正确插入,但哈希仍未正确插入。
有谁知道我可以在哪里解决这个问题?它是 Doctrine 错误吗?
--------------------------------
更新
就在执行之前,我仍然绑定(bind)了正确的数据。所以我猜这是编码或驱动程序问题。我修改了 symfony 配置:
# Doctrine Configuration
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
options:
1002: "SET NAMES 'UTF8'"
我还尝试在不使用实体的情况下执行查询以确保:
$this->db = $this->getContainer()->get('doctrine')->getConnection();
$img = '/var/www/acme/web/upload/tmp/cd1fa593cf6feb2cde83e68f461a2d947.jpg';
$hash = puzzle_fill_cvec_from_file($img);
$sql = "UPDATE image set hash=? WHERE id=?";
$stmt = $this->db->prepare($sql);
$stmt->execute(array($hash, 180));
数据库中仍然是空数据。
在另一个项目中,我使用了 Zend_Db 并且在保存这个散列时没有遇到任何问题。
我不知道这是否是 Doctrine 中的错误:(
--------------------------------
更新 2
我已经在 mysql 中记录了所有查询,我可以在日志中看到内容已正确绑定(bind)。但没有被 mysql 正确保存。
INSERT INTO image (guid, type, createTime, updateTime, images, imageSize, imageHash, status)
VALUES (
'c30df23d6b0b08aff079287e00f21ec8a',
'image',
'2013-04-22 03:30:33',
'2013-04-22 03:30:34',
'path/image.jpg',
'165458',
'?\0????\0?????????\0??????\0??????\0??????????????????????\0????\0??\0???\0???????????????????????????\0\0\0??\0?\0??\0??????????????????\0\0\0??\0?\0???????????????\0?????????????????\0?\0????????????\0?\0??????????????????????????\0?\0???????????\0???\0?????????\0??????\0\0?????????????????????\0\0??????\0???????????????\0',
1)
这是我创建的表:
delimiter $$
CREATE TABLE `image` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`guid` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`createTime` datetime NOT NULL,
`updateTime` datetime DEFAULT NULL,
`images` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`imageSize` bigint(20) DEFAULT NULL,
`imageHash` longtext COLLATE utf8_unicode_ci,
`status` integer(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$
干杯, 马克西姆
最佳答案
你不应该使用 imageHash longtext COLLATE utf8_unicode_ci,
因为 RDBM 会尝试将数据映射到字符集,如果您的哈希数据是 libpuzzle 二进制输出,这显然不匹配。
尝试更改您的架构,使您的 imageHash 列成为 BLOB。
如此处所述:http://dev.mysql.com/doc/refman/5.0/en/blob.html
BLOB 值被视为二进制字符串(字节字符串)。它们没有字符集,排序和比较是基于列值中字节的数值。
TEXT 值被视为非二进制字符串(字符串)。它们有一个字符集,值根据字符集的排序规则进行排序和比较。
关于mysql - Doctrine 2.3 - 由于特殊字符,文本字段未保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16079081/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解