-
Notifications
You must be signed in to change notification settings - Fork 364
Closed
Description
Can't insert and select NVARCHAR2 column with russian and chinese strings.
I tried to use python, encoding/nencoding parameters but i can't insert/read NVARCHAR2 column with russian and chinese strings.
These are my settings:
- Platform: Linux-5.4.0-131-generic-x86_64-with-glibc2.28
- Python version: 3.9.9
- Maxsize > 2**32: True
- Cx-Oracle version: 8.2.1
- Oracle client version: (19, 11, 0, 0, 0)
- Oracle db version: 11.2.0.1.0
DB
CREATE TABLE "DI_TEST_TABLE"
(
"LAYER" NVARCHAR2(255),
"LINGUA" VARCHAR2(255),
"DES" NUMBER(*,0)
)
SELECT * FROM NLS_DATABASE_PARAMETERS
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET')
PARAMETER VALUE
------------------------------ ------------------------------
NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16
INSERT INTO DI_TEST_TABLE VALUES (n'консэквюат', 'russian', 1)
INSERT INTO DI_TEST_TABLE VALUES (n'面料', 'chinese', 2)
SELECT * FROM DI_TEST_TABLE
LAYER LINGUA DES
-------------- ---------- -------
консэквюат russian 1
面料 chinese 2
SELECT * FROM DI_TEST_TABLE WHERE LAYER = n'консэквюат'
LAYER LINGUA DES
-------------- ---------- -------
консэквюат russian 1
PYTHON
import cx_Oracle
conn_config = {'user': 'my_user', 'password': 'my_password', 'dsn': 'my_dsn', 'encoding': 'UTF-8', 'nencoding': 'UTF-8'}
connection = cx_Oracle.connect(**conn_config)
cursor = connection.cursor()
# INSERT INTO DB
insert_query = "INSERT INTO DI_TEST_TABLE VALUES (:1, :2, :3)"
chunk = [('консэквюат', 'russian', 3),('面料', 'chinese', 4)]
cursor.executemany(insert_query, chunk)
connection.commit()
select_query = "SELECT * FROM DI_TEST_TABLE"
cursor.execute(select_query)
result = cursor.fetchall()
print(result)
# READ
select_query = "SELECT * FROM DI_TEST_TABLE WHERE LAYER = 'консэквюат'"
cursor.execute(select_query)
result = cursor.fetchall()
print(result)
select_query = "SELECT * FROM DI_TEST_TABLE WHERE LAYER = n'консэквюат'"
cursor.execute(select_query)
result = cursor.fetchall()
print(result)
connection.close()
This is python script output.
When I insert the records with python on the db the question marks (¿) are inserted.
Similarly, when I execute the select, the correct records are not retrieved but those with question marks (¿).
[('консэквюат', 'russian', 1), ('面料', 'chinese', 2), ('¿¿¿¿¿¿¿¿¿¿', 'russian', 3), ('¿¿', 'chinese', 4)]
[('¿¿¿¿¿¿¿¿¿¿', 'russian', 3)]
[('¿¿¿¿¿¿¿¿¿¿', 'russian', 3)]
I tried to use binding params and calling cursor.setinputsizes()
, but I need to execute queries without binding params because queries are read from file and chinese/russian strings are embedded into queries.
Is there a way to execute these queries correctly?