我开始尝试使用python在sqlite中存储字符串,并得到消息:
sqlite3.ProgrammingError:除非使用可解释8位字节串的text_factory(如text_factory = str),否则不得使用8位字节串.强烈建议您只需将应用程序切换为Unicode字符串.
好的,我切换到Unicode字符串.然后我开始收到消息:
sqlite3.OperationalError:无法使用文本'SigurRós'解码为UTF-8列'tag_artist'
尝试从数据库中检索数据时.更多的研究和我开始在utf8编码,但随后'SigurRós'开始看起来像'SigurRós'
注意: @John Machin指出,我的控制台设置为'latin_1'显示.
是什么赋予了?在阅读完这篇文章后,描述了我所处的完全相同的情况,似乎建议忽略其他建议并且毕竟使用8位字节串.
在开始这个过程之前,我对unicode和utf了解不多.我在过去的几个小时里学到了很多东西,但我仍然不知道是否有办法正确地将'ó'从latin-1转换为utf-8而不是破坏它.如果没有,为什么sqlite'强烈推荐'我将我的应用程序切换到unicode字符串?
我将用最后24小时内学到的所有内容的摘要和一些示例代码来更新这个问题,以便我的鞋子里的人可以有一个简单的(呃)指南.如果我发布的信息有任何错误或误导,请告诉我,我会更新,或者你们中的一个高级人员可以更新.
答案摘要
让我首先说明我理解的目标.处理各种编码的目标,如果您尝试在它们之间进行转换,则要了解源编码是什么,然后使用该源编码将其转换为unicode,然后将其转换为所需的编码.Unicode是基础,编码是该基础的子集的映射.utf_8为unicode中的每个字符都有空间,但由于它们与例如latin_1不在同一个地方,因此以utf_8编码并发送到latin_1控制台的字符串将不会像您期望的那样.在python中,获取unicode和进入另一个编码的过程如下:
str.decode('source_encoding').encode('desired_encoding')
Run Code Online (Sandbox Code Playgroud)
或者如果str已经是unicode
str.encode('desired_encoding')
Run Code Online (Sandbox Code Playgroud)
对于sqlite我实际上并不想再次编码,我想解码它并保持unicode格式.当您尝试在python中使用unicode和编码时,您可能需要注意以下四件事.
阐述:
(1)当您从源读取字符串时,它必须具有一些编码,如latin_1或utf_8.在我的情况下,我从文件名中获取字符串,所以不幸的是,我可以获得任何类型的编码.Windows XP使用UCS-2(Unicode系统)作为其本机字符串类型,这似乎是在欺骗我.对我来说幸运的是,大多数文件名中的字符不会由多个源编码类型组成,我认为我的全部都是完全latin_1,完全是utf_8,或者只是简单的ascii(这是两者的子集)那些).所以我只是阅读它们并将它们解码,就像它们仍处于latin_1或utf_8一样.但是,有可能你可以将latin_1和utf_8以及在Windows上的文件名中混合在一起的任何其他字符.有时这些角色可以显示为框,有时它们看起来很糟糕,有时它们看起来是正确的(重音符号等等).继续.
(2)Python有一个默认的系统编码,在python启动时设置,在运行时不能更改.详情请见此处.脏的总结...这里是我添加的文件:
\# sitecustomize.py
\# this file can be anywhere in your Python path,
\# but it usually goes in ${pythondir}/lib/site-packages/
import sys
sys.setdefaultencoding('utf_8')
Run Code Online (Sandbox Code Playgroud)
此系统编码是在没有任何其他编码参数的情况下使用unicode("str")函数时使用的编码.换句话说,python试图根据默认的系统编码将"str"解码为unicode.
(3)如果您正在使用IDLE或命令行python,我认为您的控制台将根据默认的系统编码显示.我出于某种原因使用带有eclipse的pydev,所以我必须进入我的项目设置,编辑测试脚本的启动配置属性,转到Common选项卡,然后将控制台从latin-1更改为utf-8,以便我可以直观地确认我在做什么工作.
(4)如果你想要一些测试字符串,例如
test_str = "ó"
Run Code Online (Sandbox Code Playgroud)
在你的源代码中,你必须告诉python你在该文件中使用了什么样的编码.(仅供参考:当我输入错误编码时,我必须使用ctrl-Z,因为我的文件变得不可读.)这可以通过在源代码文件的顶部放置一行来实现:
# -*- coding: utf_8 -*-
Run Code Online (Sandbox Code Playgroud)
如果您没有此信息,python会尝试默认将您的代码解析为ascii,因此:
SyntaxError: Non-ASCII character '\xf3' in file _redacted_ on line 81, but no encoding declared; …
Run Code Online (Sandbox Code Playgroud) 我知道,现在我有两个问题.但我很开心!
我从这个建议开始不尝试拆分,而是匹配什么是可接受的字段,并从那里扩展到这个表达式.
final Pattern pattern = Pattern.compile("\"([^\"]*)\"|(?<=,|^)([^,]*)(?=,|$)");
Run Code Online (Sandbox Code Playgroud)
表达式看起来像没有恼人的转义引号:
"([^"]*)"|(?<=,|^)([^,]*)(?=,|$)
Run Code Online (Sandbox Code Playgroud)
这对我来说效果很好 - 或者它匹配"两个引号和它们之间的任何东西",或者"行开头或逗号和行尾或逗号之间的东西".通过匹配迭代可以获得所有字段,即使它们是空的.例如,
the quick, "brown, fox jumps", over, "the",,"lazy dog"
Run Code Online (Sandbox Code Playgroud)
分解成
the quick
"brown, fox jumps"
over
"the"
"lazy dog"
Run Code Online (Sandbox Code Playgroud)
大!现在我想删除引号,所以我添加了前瞻和后瞻性非捕获组,就像我为逗号做的那样.
final Pattern pattern = Pattern.compile("(?<=\")([^\"]*)(?=\")|(?<=,|^)([^,]*)(?=,|$)");
Run Code Online (Sandbox Code Playgroud)
再次表达的是:
(?<=")([^"]*)(?=")|(?<=,|^)([^,]*)(?=,|$)
Run Code Online (Sandbox Code Playgroud)
而不是期望的结果
the quick
brown, fox jumps
over
the
lazy dog
Run Code Online (Sandbox Code Playgroud)
现在我得到了这个细分:
the quick
"brown
fox jumps"
,over,
"the"
,,
"lazy dog"
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
以下是两个完成(我认为)同样事情的代码块.
我基本上是在尝试学习如何使用Java 1.5的并发来摆脱Thread.sleep(long).第一个示例使用ReentrantLock,第二个示例使用CountDownLatch.我想要做的就是让一个线程进入休眠状态,直到另一个线程中的条件得到解决.
ReentrantLock提供了一个布尔锁定,我用来决定是否唤醒另一个线程,然后我使用条件和等待/信号来休眠另一个线程.据我所知,我需要使用锁的唯一原因是,如果多个线程需要对boolean进行写访问.
CountDownLatch似乎提供与ReentrantLock相同的功能,但没有(不必要的?)锁.然而,感觉就像我通过初始化它只需要一次倒计时来劫持它的预期用途.我认为它应该在多个线程要处理同一个任务时使用,而不是在多个线程在等待一个任务时使用.
所以,问题:
我在ReentrantLock代码中使用锁定"正确的东西"吗?如果我只在一个线程中写入布尔值,那么锁是否必要?只要我在唤醒任何其他线程之前重置布尔值我不会导致问题,我可以吗?
是否有一个类似于CountDownLatch的类,我可以使用它来避免锁定(假设我应该在这个实例中避免它们),这更适合这个任务?
有没有其他方法来改进我应该注意的代码?
例1:
import java.util.concurrent.locks.*;
public class ReentrantLockExample extends Thread {
//boolean - Is the service down?
boolean serviceDown;
// I am using this lock to synchronize access to sDown
Lock serviceLock;
// and this condition to sleep any threads waiting on the service.
Condition serviceCondition;
public static void main(String[] args) {
Lock l = new ReentrantLock();
Condition c = l.newCondition();
ReentrantLockExample rle = new ReentrantLockExample(l, c);
//Imagine this thread figures out the …
Run Code Online (Sandbox Code Playgroud) java concurrency locking countdownlatch conditional-statements
当触发器无法正常工作时,我不知道错误信息的位置.
我编写触发器的工具是Oracle的Sql Developer工具,我对如何调试它的知识几乎不存在.能够找到有关"幕后"事件的有用信息的一些指示是什么?另外,Sql Developer是否有更好的工具用于连接,测试,调试等?
到目前为止,我的方法是编写一些东西(例如触发器),用单个插入/删除测试它,然后希望它可以从它们开始工作.有没有更好的方法来确保它完全符合您的要求?例如,使用select语句,无论如何都可以看到(在调试状态或某事物中)每个级别的选择以及它如何淡化结果?任何提示非常感谢.
程序后跟输出.有人请向我解释为什么从1970年1月1日开始的10,000,000毫秒是1969年11月31日.好吧,有人请说明我的假设第一次测试应该从1970年1月1日起产生10,000,000毫秒的时间有什么问题.数字小于10,000,000产生同样的结果.
public static void main(String[] args) {
String x = "10000000";
long l = new Long(x).longValue();
System.out.println("Long value: " + l);
Calendar c = new GregorianCalendar();
c.setTimeInMillis(l);
System.out.println("Calendar time in Millis: " + c.getTimeInMillis());
String origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) + "-" + c.get(Calendar.DAY_OF_MONTH);
System.out.println("Date in YYYY-MM-DD format: " + origDate);
x = "1000000000000";
l = new Long(x).longValue();
System.out.println("\nLong value: " + l);
c.setTimeInMillis(l);
System.out.println("Calendar time in Millis: " + c.getTimeInMillis());
origDate = c.get(Calendar.YEAR) + "-" + c.get(Calendar.MONTH) …
Run Code Online (Sandbox Code Playgroud) 编辑:TL; DR版本
我输入了这个
CREATE INDEX IF NOT EXISTS IDX_FILE_SIZE table_name (file_size);
Run Code Online (Sandbox Code Playgroud)
而不是这个
CREATE INDEX IF NOT EXISTS IDX_FILE_SIZE ON table_name (file_size);
Run Code Online (Sandbox Code Playgroud)
不要那样做.
摘要:异常告诉我该事务是只读的; 调试println似乎表明我不是只读模式.
为互联网出版编辑的课程 - 抱歉,如果我输入错误的内容,但这是代码中的问题给我的问题.saveOrUpdate在其他对象类型上调用时有效,但在此对象上没有.我正在调试时将println添加到saveOrUpdate.我没有编写抽象类,我只是想尝试使用它(现在调试它).
代码下面的相关输出.不知道从哪里开始.
调查后更新:我也正在对spring配置进行一些更新,同事指出我调用updateAParameter的一种方法是以一种方式使用spring,而破坏的方法是以另一种方式使用它.不幸的是,破碎的方式是我试图去的方式.
所以我现在理解的问题是,如果我通过获取bean在方法中"手动"实例化DataObjectDAOImpl,那么它允许我正确地写回Hibernate.如果我使用spring为该bean设置一个类变量,所以我不必在每个方法中实例化它,那么当我访问一个试图写入Hibernate的方法时会发生InvalidDataAccessApiUsageException,尽管它报告不在只读模式.我的同事有关于这个主题的理论,但我不明白他想说的是什么 - 关于从SampleClass中提取界面的事情.
// Old way that works.
public class SampleClass {
public void someMethod {
ApplicationContext ac = ApplicationContextFactory.getApplicationContext();
DataObjectDAOImpl dodi = ((DataObjectDAOImpl) ac.getBean("dodi"));
//this works
dodi.updateAParameter("foo", exampleDataObject);
}
}
//New way that doesn't work but I would like it to.
public class SampleClass {
private DataObjectDAOImpl dodi = null;
//'dodi' has getter and setter methods that I am not pasting here for simplicity
public void someMethod {
//causes Exception
dodi.updateAParameter("foo", exampleDataObject); …
Run Code Online (Sandbox Code Playgroud) 我收到消息"文字与格式字符串不匹配".
例如,以下是Java类中的一些方法:
public String getDateTime();
public void setDateTime(String date_time);
Run Code Online (Sandbox Code Playgroud)
以下是该类的Hibernate配置文件的映射:
<property name="dateTime" column="date_time">
Run Code Online (Sandbox Code Playgroud)
这是该列的DDL:
CREATE TABLE "SCHEMA"."TABLE_NAME"
(
"DATE_TIME" DATE,
etc.
)
Run Code Online (Sandbox Code Playgroud)
我尝试将type ="date"和"timestamp"(不是同时)设置为hibernate配置中属性的attr,然后将Java类型从String更改为Date,但这给了我一个不同的错误.我读了一些关于绑定参数的内容,但却无法做出正面或反面.
当我从配置中注释掉该属性时,其他一切都正常工作,所以我确定这是我的问题.令人讨厌的是我有另一个表/类映射,看起来是相同的Oracle Date-> Java String映射,它没有给我这个问题.
所以正则表达式似乎与最长的匹配相匹配.例如:
public static void main(String[] args) {
String s = "ClarkRalphKentGuyGreenGardnerClarkSupermanKent";
Pattern p = Pattern.compile("Clark.*Kent", Pattern.CASE_INSENSITIVE);
Matcher myMatcher = p.matcher(s);
int i = 1;
while (myMatcher.find()) {
System.out.println(i++ + ". " + myMatcher.group());
}
}
Run Code Online (Sandbox Code Playgroud)
生成输出
我想要这个输出
我一直在尝试以下模式:
Pattern p = Pattern.compile("Clark[^((Kent)*)]Kent", Pattern.CASE_INSENSITIVE);
Run Code Online (Sandbox Code Playgroud)
这不起作用,但你看到我想说的话.我想要从Clark到Kent的字符串不包含任何Kent的字符串.
这个字符串:
ClarkRalphKentGuyGreenGardnerBruceBatmanKent
应该产生输出
我是一个新的编写SQL,我有一个关于连接的问题.这是一个选择示例:
select bb.name from big_box bb, middle_box mb, little_box lb
where lb.color = 'green' and lb.parent_box = mb and mb.parent_box = bb;
Run Code Online (Sandbox Code Playgroud)
所以我要说的是,我正在寻找所有大盒子的名字,这些盒子里面嵌套着一个绿色的小盒子.如果我理解正确,上面的语法是通过使用'join'关键字获得相同结果的另一种方法.
问题:上面的select语句是否对它正在进行的任务有效?如果没有,有什么更好的方法呢?是连接的语句语法糖还是实际上正在做其他事情?
如果你有关于这个主题的任何好材料的链接,我很乐意阅读它,但由于我不知道究竟是什么称这种技术,我在谷歌上搜索它有困难.
这是我的eclipse.ini文件:
-startup
plugins/org.eclipse.equinox.launcher_1.0.200.v20090520.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_1.0.200.v20090519
-product
org.eclipse.epp.package.java.product
--launcher.XXMaxPermSize
256M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms40m
-Xmx256m
Run Code Online (Sandbox Code Playgroud)
默认的东西.但是,我有一个应用程序似乎崩溃64 MB的堆大小.我每隔几秒打印一次堆大小(以字节为单位),直到它崩溃,这是最后一个输出:
66650112线程"main"中的异常java.lang.OutOfMemoryError:java.lang上的Java堆空间等
我正在使用Sun的java.还有另一个地方需要设置java可用的最大ram吗?