除了建立连接外,我在使用clojure.contrib.sql做任何事情时都遇到麻烦.
我有一个在localhost:3306上运行的mysqld,数据库名为clj_db.
密码为“ clj_pass”的用户“ clj_user” @“ localhost”可以访问该数据库.
当尝试“从clj_table中选择*”时,我得到一个“ com.mysql.jdbc.exceptions.MySQLSyntaxErrorException:您的SQL语法有误;请查看与您的MySQL服务器版本相对应的手册,以获取在’附近使用正确的语法” ????????????????’在第1行”.
我究竟做错了什么?
clj_db.clj_table
CREATE TABLE `clj_table` (
`col_one` int(11) NOT NULL,
`col_two` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
mysql_test.clj
(ns test.mysql
(:use clojure.contrib.sql)
)
(def db-settings
{:classname "com.mysql.jdbc.Driver"
:subprotocol "mysql"
:subname "//localhost:3306/clj_db"
:user "clj_user"
:password "clj_pass"})
(with-connection db-settings
(with-query-results rs ["select * from clj_table"]
(dorun (map #(println (:col_one :col_two %)) rs))
))
输出量
Exception in thread "main" com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '????????????????' at line 1 (mysql_test.clj:0)
at clojure.lang.Compiler.eval(Compiler.java:4658)
at clojure.lang.Compiler.load(Compiler.java:4972)
at clojure.lang.Compiler.loadFile(Compiler.java:4939)
at clojure.main$load_script__7405.invoke(main.clj:213)
at clojure.main$script_opt__7442.invoke(main.clj:265)
at clojure.main$main__7466.doInvoke(main.clj:346)
at clojure.lang.RestFn.invoke(RestFn.java:441)
at clojure.lang.Var.invoke(Var.java:367)
at clojure.lang.AFn.applyToHelper(AFn.java:179)
at clojure.lang.Var.applyTo(Var.java:476)
at clojure.main.main(main.java:37)
Caused by: com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '????????????????' at line 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1048)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3563)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3495)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2687)
at com.mysql.jdbc.ConnectionImpl.configureClientCharacterSet(ConnectionImpl.java:1859)
at com.mysql.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:3593)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2199)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:784)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:350)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:284)
at java.sql.DriverManager.getConnection(libgcj.so.10)
at clojure.contrib.sql.internal$get_connection__218.invoke(internal.clj:85)
at clojure.contrib.sql.internal$with_connection_STAR___226.invoke(internal.clj:102)
at test.mysql$eval__386.invoke(mysql_test.clj:12)
at clojure.lang.Compiler.eval(Compiler.java:4642)
...10 more
解决方法:
我已改用Sun的JDK6而不是GIJ.
我收到“ com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败”.
我找到了this thread,这对我有很大帮助.
我添加了选项“ -Djava.net.preferIPv4Stack = true”,它现在可以正常工作.
谢谢大家!