Python Sqlite3 函数 LOWER UPPER 无法使用
import sqlite3
connection = sqlite3.connect('test.db')
cursor = connection.cursor()
cursor.execute("DROP TABLE `products`")
cursor.execute('''CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
name TEXT
)''')
cursor.execute("INSERT INTO products (name) VALUES (?)", ('Päärynä',))
cursor.execute("INSERT INTO products (name) VALUES (?)", ('Банан',))
cursor.execute("INSERT INTO products (name) VALUES (?)", ('Banana',))
connection.commit()
cursor.execute(
"SELECT LOWER(name), UPPER(name), name FROM products WHERE name='Päärynä' OR name='Banana' OR name='Банан'")
result = cursor.fetchall()
connection.close()
print(result)
#[('päärynä', 'PääRYNä', 'Päärynä'), ('Банан', 'Банан', 'Банан'), ('banana', 'BANANA', 'Banana')]
我注意到并不是所有的语言都能被改变。这该怎么解决呢?
2 个回答
1
SQLite的UPPER函数只对ASCII字符有效,具体可以参考文档:
upper(X)
upper(X)函数会返回输入字符串X的一个副本,其中所有的小写ASCII字符都被转换成对应的大写字符。
这种行为在不同的数据库系统中可能会有所不同;比如在PostgreSQL中,我们会得到:
test# select upper('Päärynä');
upper
═════════
PÄÄRYNÄ
(1 row)
1
很遗憾,sqlite的UPPER函数只对ASCII字符有效。这是sqlite的一个限制,所以在生产环境的数据库中通常不太会用到。不过,为了回答你的问题,如果你一定要使用SQLite,这里有一个我在本地的python脚本中验证过的解决方案:
import sqlite3
# Connect to database
conn = sqlite3.connect('test.db')
c = conn.cursor()
# Create table if not exists
c.execute('''CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY,
name TEXT
)''')
# Insert data into table
def to_ascii_equivalent(char):
return char.encode().decode('utf-8').upper()
product_name = 'Банан'
product_id = c.execute("INSERT INTO products (name) VALUES (?)", (to_ascii_equivalent(product_name),)).lastrowid
# Retrieve data from table
c.execute("SELECT * FROM products WHERE name=?", (to_ascii_equivalent(product_name),))
result = c.fetchone()
# Print result
print(result)
# Close database connection
conn.close()
虽然这个方法看起来不太好,但如果你必须用sqlite,它是有效的。这里我特别关注的是俄语,但这个过程对其他语言也适用。下面是输出结果:
(7, 'БАНАН')